Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Ordner auslesen und die angezeigten Einträge kürtzen.

Frage Entwicklung PHP

Mitglied: point

point (Level 1) - Jetzt verbinden

10.10.2012, aktualisiert 14:23 Uhr, 3406 Aufrufe, 30 Kommentare

Ich lese den Inhalt eines Ordners aus, es handelt sich um Bilder. Diese werden dann als kleine Vorschaubild angezeigt und können durch Anklicken des jeweiligen Vorschaubildes groß angezeigt werden.

Ich lese mittels PHP den Inhalt eines Ordners aus, es handelt sich um Bilder. Diese werden dann als kleine Vorschaubild angezeigt und können durch Anklicken des jeweiligen Vorschaubildes groß angezeigt werden.

Hier ist ein Beispiel: http://www.asien.l-seifert.de/nepal/Familie.html

Ist es möglich, mittels PHP die Liste der angezeigten Bilder zu kürzen, damit nur etwa 5 Bilder vor und 5 Bilder nach dem angezeigten Bild bei den Vorschaubildern angezeigt werden? Der Befehl substr scheint dafür nicht geeignet zu sein.
Vielen Dank für jede Idee.

Viele Grüße von Lothar
30 Antworten
Mitglied: EvilMoe
10.10.2012 um 14:34 Uhr
Hallo,

eine Lösung wäre alle Bilder also die Dateinamen in einen Array zu speichern. Dann kannst du deine Schleife ganz einfach so lange laufen lassen wie du möchtest.


Sven
Bitte warten ..
Mitglied: point
10.10.2012 um 16:30 Uhr
Hallo Sven,

vielen Dank für die schnelle Antwort. Mein Problem, genau da verlassen mich meine PHP- Kenntnisse. Was würde das kosten, wenn mir hier jemand das Skript so umschreiben kann?
Mit einer .htaccess wandle ich noch den Bildernahme.jpg in eine Bildernahme.html - Datei, was man im untenstehenden Skript aber nicht sehen kann.
So sieht das im Moment aus:

$dir = ".";
$dh = opendir($dir);
{
while (false !== ($filename = readdir($dh)))
if ($filename != "." && $filename != "..")
{
$files[] = $filename;
}
sort($files);
foreach ($files as $value)
{
$name = $value;
$name = ereg_replace('.jpg', '', $name);
$bilder ="$name";
$name = ereg_replace('-', ' ', $name);
$name = preg_replace( "/(oe)/im", "ö", $name);
$name = preg_replace( "/(ue)/im", "ü", $name);
$name = preg_replace( "/(ae)/im", "ä", $name);
$val=pathinfo($value);
$val=$val["extension"];
if (($val=="jpg") or ($val=="JPG")){
$var = explode(".", $bilder);
echo "<a class='a' href='$var[0].html' title='$name'><IMG SRC='$ordner/$value' alt='$name' style='$border;' width='$width' height='$height'></a>&nbsp;";
} }
closedir($dh);
}

Viele Grüße Lothar
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 16:40 Uhr
Hallo,

was ich oben sagte macht dein Script bereits. $files enthält deine Bilder.

Was man nun noch bräuchte wäre der Dateiname im Script. Ich vermute das du in deiner htaccess den als Parameter an dein Script übergibst.
Dann wäre es möglich es so zu bauen wie du möchtest.
Bitte warten ..
Mitglied: point
10.10.2012 um 17:45 Uhr
Hallo Sven,

der Dateiname wird bei Aufruf der Seite aus dem Namen der Bilddatei erzeugt, wobei die .htaccess aus dem .jpg ein .html macht. Siehe: http://www.asien.l-seifert.de/nepal/Familie.html

Dieser Link erzeugt dann die Anzeige des großen Bildes:
echo "<IMG SRC='$Bild' alt='$titelbild'>";

Ich hoffe, Du kannst damit etwas anfangen.

Viele Grüße
Lothar
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 18:11 Uhr
Die Frage ist Woher das $Bild kommt. Kommt das aus $_GET?
Das wäre noch zu klären.

Ansonsten müsste der Code in etwas so aussehen (ungetestet).
$bild muss jetzt das aktuelle Bild enthalten bzw gesetzt werden. Dazu müsstest du mal in der htaccess schauen welchen Variablennamen du dafür verwendest.
01.
 
02.
<?php 
03.
$bild	= ""; // dateiname vom aktuellen Bild 
04.
$anz	= 5; // vorlauf, nachlauf 
05.
 
06.
$dir	= "."
07.
$dh = opendir($dir); 
08.
09.
	$file = array(); 
10.
	while (false !== ($filename = readdir($dh))){ 
11.
		if ($filename != "." && $filename != ".."
12.
13.
			$files[] = $filename
14.
15.
16.
	sort($files); 
17.
		 
18.
	 
19.
	$id_cur = array_keys($files, $bild); // index aktuelle bild 
20.
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen 
21.
	if(!in_array($bild, $files) || $id_cur <= 5){ 
22.
		$start	= 0; 
23.
		$ende	= $anz;	 
24.
	} else
25.
		$start	= $id_cur-$anz
26.
		$ende	= $id_cur+$anz
27.
28.
	$ende = ($ende > count($files)) ? count($files): $ende
29.
		 
30.
	for($i=$start; $i < $ende; $i++) 
31.
32.
		$name = $files[$i]; 
33.
		$name = ereg_replace('.jpg', '', $name); 
34.
		$bilder = $name
35.
		$name = ereg_replace('-', ' ', $name); 
36.
		$name = preg_replace( "/(oe)/im", "&ouml;", $name); 
37.
		$name = preg_replace( "/(ue)/im", "&uuml;", $name); 
38.
		$name = preg_replace( "/(ae)/im", "&auml;", $name); 
39.
		 
40.
		$val=pathinfo($files[$i]); 
41.
		$val=$val["extension"]; 
42.
		if (($val=="jpg") or ($val=="JPG")){ 
43.
			$var = explode(".", $bilder); 
44.
			echo "<a class='a' href='$var[0].html' title='$name'><IMG SRC='$ordner/$files[$i]' alt='$name' style='$border;' width='$width' height='$height'></a>&nbsp;"
45.
46.
47.
	closedir($dh); 
48.
49.
 
50.
?> 
51.
 
Bitte warten ..
Mitglied: point
10.10.2012 um 18:46 Uhr
Das steht in der .htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,QSA,L]
RewriteRule ^index\.(html?|php)$ http://%{HTTP_HOST}/ [R=301,QSA,L]

Zu: Woher das $Bild kommt. Kommt das aus $_GET?
Kann das in dieser Zeile übergeben werden?
$Bild = $_GET["Bild"];

Ich habe es so ausprobiert wie von dir gepostet, da werden immer nur die ersten 5 Vorschaubilder angezeigt. Ersete ich die Zeile 03. $bild = ""; mit $Bild = $_GET["Bild"]; , dann ist hier in dieser Zeile 25. $start = $id_cur-$anz; eine Fehlermeldung Fatal error: Unsupported operand types
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 18:55 Uhr
Wenn du es so probierst wie ich es geschrieben habe kann er auch nur dir ersten Bilder anzeigen. Die Variable $bild muss gesetzt werden wie du es geschrieben hast.



EDIT: Sorry, ich habe einen kleinen Fehler drin. Zeile 19. Nach der Zeile muss noch dies kommen:
01.
$id_cur = $id_cur[0];
array_keys gibt ein Array zurück und nicht direkt den Key.
Bitte warten ..
Mitglied: point
10.10.2012 um 19:23 Uhr
Das sieht ja schon echt gut aus. Ein Problem war noc: $bild muss $Bild geschrieben werden.
Nun tritt noch ein Problem auf. Bisher hatte ich auch dieses im Script stehen, was ich zur Vereinfachung rausgenommen hatte:


if (ereg("($value)", $Bild)) /* angezeigtes Bild vergr&ouml;&szlig;ern*/
{
$width='38';
$height='43';
$border='border-color:#FF7F00;border-bottom-width:4px;border-top-width:2px;border-style:solid';
}
else {
$width='36';
$height='42';
$border='border-bottom-width:0px';
}

Das funktioniert nun leider nicht mehr und ich bekomme nicht heraus, warum.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 19:31 Uhr
$value muss nun $files[$i] heißen.

EDIT: Habe mir deine Seite eben noch mal angesehen. Du hast momentan 5 vor dem eigentlichem Bild und 4 da nach. Wenn das auch 5 sein sollen musst du
01.
for($i=$start; $i < $ende; $i++)  
02.
//zu 
03.
for($i=$start; $i <= $ende; $i++)  
04.
//machen
Bitte warten ..
Mitglied: point
10.10.2012 um 19:45 Uhr
Bis zum 6 Bild geht es leider noch nicht. Bei den Bildern 1 - 6 bleibt alles, wie es ist und rutscht nicht weiter.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 19:49 Uhr
Mein Fehler, Zeile 23
01.
$ende	= $anz; 
02.
 
03.
// muss aber heißen: 
04.
$ende	= $anz+$id_cur;
Bitte warten ..
Mitglied: point
10.10.2012 um 20:13 Uhr
Das gibt es einfach nicht, wie Du die Sache beherrscht. Meine Hochachtung. Es klappt alles. Nun hat das Chaos mit den vielen Vorschaubildern ein Ende und ich kann so viel Bilder einfügen, wie auf eine Reihe passen.
Die Anzahl habe ich auf 10 gesetzt und auch hier auf 10 erhöht.
if(!in_array($Bild, $files) || $id_cur <= 10)

Ganz am Schluss bleiben es aber noch bei 5 angezeigten Bildern. Wo kann die 5 herkommen?
http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html

Könnte man noch das letzte und das erste Bild jeweils durch eine andere Grafik aus einem anderen Ordner ersetzen, das könnten dann Pfeilgrafiken sein. Damit die Leute wissen, das es da weitergeht.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 20:18 Uhr
Hast du $anz=10 gesetzt?
Die 5 die im Code stand sollte auch $anz sein.
Bitte warten ..
Mitglied: point
10.10.2012 um 20:26 Uhr
Ja, habe ich. Die Zahl 5 steht nirgendwo mehr. Beide sind durch 10 ersetzt.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 20:32 Uhr
Die 10 im Code kannst du gegen $anz austauschen.

Ich sehe das Problem auch schon, deine Dateinamen beinhalten ein Leerzeichen (sollte man aus solchen Gründen im Web eh vermeiden).

Versuche es mal hier mit:
01.
$Bild = (isset($_GET["Bild"]) ? str_replace(" ", "-", $_GET["Bild"]) : ""; 
Bitte warten ..
Mitglied: point
10.10.2012 um 20:51 Uhr
Es bleibt bei den 5 angezeigten Bildern am Schluss, siehe: http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html
Das ist merkwürdig, da 5 nirgendwo steht. Erst ab den 4-letzten Bild geht es richtig.

In den Dateinamen ist eigentlich nie ein Leerzeichen. Immer ein - (minus). Das lösche ich nur, wenn ich den Dateinamen noch für andere Zwecke wie die alt und title- Tags verwende. Wo hast Du die Leerzeichen gesehen? Da muss ich irgendwo was übersehen haben.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 21:00 Uhr
Mach mal folgendes.
Schreib mal nach der while Schleife ein
01.
var_dump($files); 
02.
var_dump($_GET);
Gehe dann auf die letzen Bilder und sag mir davon mal per PM die Ausgabe. Es hat kein Sinn mehr hier weiter zu schreiben solange wir noch ein Fehler suchen.
Bitte warten ..
Mitglied: point
10.10.2012 um 21:08 Uhr
Ich habe es eingefügt.
Die Ausgabe ist sehr lang, klicke mal auf:
http://www.asien.l-seifert.de/nepal/zwei-Maedchen.html
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 21:34 Uhr
Sieht OK aus, das var_dump sollte nicht in die Schleife, darum ist es so lang ;)
An dem Leerzeichen dürfte es nicht liegen.

Ich glaube ich habe den Fehler gefunden:
01.
	 
02.
$id_cur = array_keys($files, $bild); // index aktuelle bild 
03.
$id_cur = $id_cur[0]; 
04.
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen 
05.
	if(!in_array($bild, $files) || $id_cur <= $anz){ 
06.
		$start	= 0; 
07.
		$ende	= $id_cur+$anz;	 
08.
	} else
09.
		$start	= $id_cur-$anz
10.
		$ende	= $id_cur+$anz
11.
12.
	if($ende > count($files)) $ende = count($files); 
13.
 
Ich hoffe das es nun stimmt^^
Bitte warten ..
Mitglied: point
10.10.2012 um 21:21 Uhr
Zeile 07
} else {
Bringt:
Parse error: syntax error, unexpected '}
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 21:24 Uhr
Vollständig kopiert? Richtig ersetzt?
Der Code ist richtig.
Bitte warten ..
Mitglied: point
10.10.2012 um 21:32 Uhr
War vielleicht doch ein Fehler beim kopieren.
Nun kommt in Zeile 08.
$start = $id_cur-$anz;

Fatal error: Unsupported operand types
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 21:34 Uhr
Den Fehler hatten wir oben schon, vergessen mit zu kopieren.
Habe ich korrigiert oben.
01.
$id_cur = array_keys($files, $bild); // index aktuelle bild 
02.
$id_cur = $id_cur[0]; 
03.
	// Wenn kein Bild ausgeäwhlt ist oder eines der ersten bilder ausgewählt ist bei 0 anfangen 
04.
	if(!in_array($bild, $files) || $id_cur <= $anz){ 
05.
		$start	= 0; 
06.
		$ende	= $id_cur+$anz;	 
07.
	} else { 
08.
		$start	= $id_cur-$anz; 
09.
		$ende	= $id_cur+$anz; 
10.
11.
	if($ende > count($files)) $ende = count($files); 
12.
 
Bitte warten ..
Mitglied: point
10.10.2012 um 21:46 Uhr
Nun zeigt es nur noch die letzten zehn Bilder an, egal, welches Bild ich anklicke.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012, aktualisiert um 21:54 Uhr
Hast du $bild auch $Bild genannt?
Das hatte ich nicht übernommen.

Ich meine diese Zeile:
01.
if(!in_array($bild, $files) || $id_cur <= $anz){ 
Bitte warten ..
Mitglied: point
10.10.2012 um 21:56 Uhr
Ja, habe ich. Wenn das nicht stimmt, zeigt es alle Vorschaubilder an.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 21:58 Uhr
Wenn du diese Zeile:
01.
$ende	= $id_cur+$anz;
wieder in
01.
$ende	= $anz;
änderst. Hast du dann wieder das alte Resultat?
Bitte warten ..
Mitglied: point
10.10.2012 um 22:04 Uhr
Wenn ich beide (06. und 09.) austausche, sind alle Bilder weg.
wenn ich nur 09. austausche auch.
Wenn ich 06. austausche, bleibt es wie es war.
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 22:06 Uhr
Melde dich mal auf meine PM......
Bitte warten ..
Mitglied: EvilMoe
10.10.2012 um 23:16 Uhr
Fehler gefunden.

Problem lag daran das sich im Ordner außer den .jpg noch andere Dateien befanden wodurch der Counter nicht mehr stimmte.

Lösung war es nun nur die .jpg mittel glob einzulesen.
Bitte warten ..
Neuester Wissensbeitrag
DSL, VDSL

Telekom blockiert immer noch den Port 7547 in ihrem Netz

(3)

Erfahrungsbericht von joachim57 zum Thema DSL, VDSL ...

Ähnliche Inhalte
Batch & Shell
Dateien im Ordner auslesen und umbennen (10)

Frage von jocheng zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...