• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Pfad auslesen -> in Array

Guido

New member
Hallo zusammen!

PHP:
<?php 
	
	 $folder = "/apache/htdocs/www/php/übungen/body/";  /* Verzeichnispfad Offline */
	
	$handle = opendir($folder);
		 while ($entry = readdir($handle))
			{
				if (!ereg("^.$",$entry))
					{
						if (!ereg("^..$",$entry))
							{
								$dirname = ucfirst($entry);
								echo $dirname, "<br>";
								if(!is_dir($entry))
									{	
										strtolower($entry);
										$sep = "/";
										$cdir = $folder.$entry.$sep;
										chdir($cdir);
										$cfile = opendir($cdir);
										while($entryfile = readdir($cfile))
											{
												if(is_file($entryfile))
													{
														if (!ereg("^.$",$entry))
															{
																if (!ereg("^..$",$entry))
																	{
																		echo "<a href='$entry/$entryfile'>";
																		$filename = split("\.",$entryfile);
																		echo ucfirst($filename[0]);
																		echo "</a><br>"; 
																	}
            												}
													}
											}
									} 
								
									{ echo " "; }
							}
						else
							{ echo " "; }
					}
				else
					{ echo " "; }
			} 
?>

Dieses Skript liest alle Unterverzeichnisse und deren Dateien ein und gibt sie aus im Format:

Verzeichnis 1
Datei 1
Datei 2
Datei 3
Verzeichnis 2
Datei 1
Datei ...

Was ich mir aber dafür wünsche ist, dass die Verzeichnisse und die Dateien in jeweils einem eigenen Array
gespeichert werden und an anderer Stelle ausgegeben werden.
Hat jemand dafür eine Lösung, oder einen Lösungshinweis?

Danke und Ade
Guido
 
ich weiß ja nicht, ob Du mit Deinem Skript bewußt nur eine Verzeichnisebene tiefer gehst, außerdem ist das Ganze ein bißchen redundant ausgelegt...

prinzipiell würde ich einen Verzeichnisdurchlauf in einem rekursiven Algorithmus realisieren, da dabei alle Verzeichnisse durchsucht werden. Eine optionale Tiefenvariable sorgt für einen Abbruch bei Erreichen einer vordefinierten Verzeichnistiefe (in Deinem Fall z.B. 1)...

Wenn Du die Daten zunächst speichern möchtest, dann kommt als einzigste Datenstruktur ein Baum in Frage, diesen kannst Du z.B. als Arrays realisieren. Dabei wird für jedes Unterverzeichnis ein Array angelegt und an die entsprechende Stelle im übergeordneten Array eingehängt. Damit dabei der Verzeichnisname nciht verloren geht, sollte er als erster Eintrag im untergeordneten Array abgelegt werden.

Vom Code her, würde ich schätzen, könnte ein rekursiver Durchlauf mit halb so vielen Zeilen auskommen, wie Dein Beispiel....

soweit die Theorie....
 
alle theorie ist grau ;)

Hallo Albu!
Vielen Dank für die Hinweise. Leider kann ich nicht so viel damit anfangen!
Da das Script schlecht ist hoffte ich auf einen HANDLUNGS-HINWEIS seitens des Forums.
Z.B.:
Mit meiner Methode kann ich nur jeweils einen Wert in ein Array übergeben.
Wie ändere ich das?
Vielleicht kannst du ja etwas mehr Weiss in das Grau der Theorie packen...

Ade
Guido

PS: Ich glaube ich sollte das ganze anders anfangen...
 
so dann man Praxis:

PHP:
$startPath = "/apache/htdocs/www/php/übungen/body/";
$MayDepth = -1;

function recurseFolder ($folder, $depth)
{
  $arrRetVal = array ($folder);
  $handle = opendir($folder);
  if ($MaxDepth != -1)
  {
    if ($depth >= $MaxDepth)
    {
      return $arrRetVal;
    }
  }
  while ($entry = readdir($handle))
  {
    if (!ereg("^.[.]?$",$entry))
    {
      $dirname = ucfirst($entry);
      if(!is_dir($entry))
      {
        $arrRetVal [] = recurseFolder ($folder.$dirname, $depth + 1);
      }
      else
      {
        $arrRetVal [] = $dirname;
      }
    }
  }
  closedir ($handle);
  return $arrRetVal;
}

$arrResults = recurseFolder ($startPath, 0);

Die Funktion ist auf dem Trockenen enstanden und wurde nicht getestet!!!

Sie rennt durch alle Verzeichnisse unterhalb des angegebenen Verzeichnisses und sammelt alles in einer Hierarchie von Arrays. Dabei erhält jeder Verzeichniseintrag ein Array, jeder Dateieintrag den direkten Dateinamen.
Jedes Array enthält an Stelle 0 jeweils den Namen des aktuellen Verzeichnisses.

Wenn Du die Tiefenüberprüfung nicht brauchst, dann kann man das natürlich rausnehmen....

Die Auswertung der Arrays muß natürlich dann auch irgendwann erfolgen, aber das kann fast analog ebenfalls mit einem rekursiven Algorithmus erledigt werden. Und wie sowas geht siehst Du am vorliegenden Beispiel.... :)
 
arrays vor der rekursion

Hallo Albu!

Vom rekursiven Durchlauf hab ich die Finger gelassen... Ich muss mich eindeutig erstmal mit Arrays näher beschäftigen!
Lassen wirs also bei einer Verzeichnisebene. Damit habe ich schon genug Ärger!
PHP:
foreach ($dirs as $dir_key => $dir_value) {
$files[] = $entryfile;
$dirs = array("$dir_value" => "$files");
}
Hiermit erstelle ich (hoffentlich) einen Array, der als key die Namen der Verzeichnisse enthält und als value sämtliche Dateien eben dieses Verzeichnisses erhält.
$key[verzeichnis1] - $value[datei1, datei2, datei3, ...]

Stimmt das soweit?

Gut!

WIE BEKOMME ICH DAS ARRAY AUSGELESEN???

HELP NEEDED
Ade
Guido

P.S.: attached: bisherige Gehversuche
 

Anhänge

  • dir_und_file.php.txt
    1,9 KB · Aufrufe: 5
Das array auszulesen, sollte nicht sonderlich schwer werden wenn du schon soweit gekommen bist. Ein einfacher Vorschlag für ein eindimensionales array:

foreach($files as $item){
print $item."<br>";
}

weiterhin besteht die Möglichkeit, mit einer normalen for oder while Schleife das array auszulesen.

Weiterhin ist folgender Link vielleicht ganz hilfreich für dich:

http://www.zend.com/codex.php?id=775&single=1

dort ist ein Script, das eigentlich genau das macht, was du vorhast, zwar auf englisch, aber dafür sehr gut kommentiert:)
 
Hallo s-g!
Vielen Dank für den Link! Das rekursiv von Albu hatte mich schon zu phpwelt geschickt, dort gibt es ein ähnliches Skript - in deutsch! Das ist schon das was ich suche, ABER ;) Ich verstehe es nicht ! :(
Ich verstehe aber das was dahinter steckt.
Für mich erstmal interessanter, weil von direkterem Nutzen ist der Umgang mit Arrays!

Ich wil ein Array folgendermassen:
$dir_file : unterverzeichnis => datei1,datei2,datei3
$dir_file[foo] sollte also (foo/)datei1, (foo/)datei2,... wiedergeben
Tut das mein Script denn???

Ausgabe des Skripts:
Code:
Kontakt - Array
Warning: Invalid argument supplied for foreach() in C:\apache\htdocs\www\php\übungen\dir_und_file_navigation.php on line 35
Also zuerst heisst es "Array", und dann kann es nicht als Array behandelt werden?
Wie krieg ich [>EBEN DIESEN<] Array ausgelesen ?

THX und Ade
Guido

PHP:
<?php
function navigate($dir,$myfolder) {
$folder = "/apache/htdocs/www/php/übungen/$myfolder/";
$dir_file = array();
$files = array();
$handle = opendir($folder);
	while ($entry = readdir($handle))
	{
		if (!eregi("^\.{1,2}$",$entry))
		{
		$dirname = ucfirst($entry);
			if(!is_dir($entry))
			{
			$cdir = $folder.$entry."/";
			chdir($cdir);
			$cfile = opendir($cdir);
				while($entryfile = readdir($cfile))
				{
					if(is_file($entryfile))
					{
					$files[] = $entryfile;
					$dir_file = array("$dirname" => "$files");
					}
				}
			} 
		}
	}
return $dir_file;
}
$level0 = navigate("../","body");
foreach($level0 as $key=>$val) {
	print "$key - $val";
####################### Es folgt Zeile 35
	foreach($val as $x=>$y) {
	print "$y<br>";
	}
}

P.S.: Sorry für den vielen Code im Thread!
 
Wenn dein vorangiges Ziel ist, den Umgang mit Arrays zu lernen, würde ich dir etwas einfacheres zum Einsteig empfehlen ;).

Mal schauen, vielleicht find ich morgen eine passende Lösung :)
 
Das Problem liegt tatsächlich an Deiner Unkenntnis im Umgang mit Arrays, bzw. vielmehr mit assoziativen Containern...

folgende Zeile mußt Du definitiv ändern:
PHP:
$dir_file += array($dirname => $files);

in Deiner Version überschreibst Du jedesmal das Array dir_file, mit dem zuletzt gelesenen Verzeichnis, anstatt es anzuhängen (deswegen das +=)
Außerdem verwendest Du Strings, was hier falsch ist. Bei $dirname mag es noch funktionieren, aber Du willst dem $dirname ein Array zuordnen und keinen String (der letztendlich nur das Wort "Array" enthält (siehe Deine Ausgabe vor der Fehlermeldung: Kontakt - Array) !!!).
Dies erklärt dann auch die Fehlermeldung in Zeile 35, $val ist _kein_ Array, es ist ein String!!

Desweiteren solltest Du oben genannte Zeile aus der inneren While Schleife herausnehmen und eher direkt dahinter platzieren. Es würde zwar auch so funktionieren, aber es wäre unnötiger und überflüssiger Code...

Außerdem muß die Zuweisung, bzw. Initialisierung des Arrays files vor die innere While Schleife gezogen werden, da sonst alle Dateien kumuliert werden, d.h. das letzte Verzeichnis enthält plötzlich alle Dateien aller anderen Verzeichnisse!!!

Und wie immer ist der genannte Code nicht getestet, sondern nur aus meinen Fingern gesaugt, es wird keine Garantie für die Lauffähigkeit übernommen und offen gelassene Werte, Felder, Variablen oder Funktionen sind durch geeignete Werte zu ersetzen / ergänzen.... ;) ;)
 
Hallo!

Also nur damit ich auch meinen Senf dazu gegeben habe.
Ich lese Verzeichnisse und Dateien folgendermassen aus:

PHP:
<?

$handle=opendir($dir);
        while ($file = readdir($handle))
                {
                if(is_dir($file)) $dirlist[] = $file;
                if(is_file($file)) $filelist[] = $file;
                }
        closedir($handle);
asort($dirlist);
asort($filelist);

?>

Damit sollte es eigentlich kein Problem mehr sein die einzelnen Verzeichnisse und Dateien auszulesen(in $dir).
 
Zuletzt bearbeitet:
gäähn

@all
Danke! Ich werd mir Mühe geben!

@style-guide
Ich will halt verstehen, was dort passiert, ansonsten kann ich das Array nicht wirklich wieder auseinanderpflücken.

@Albu
Du hast mich ertappt!


...und eigentlich wollte ich doch nur...
Ade
Guido
 
mir ist grad eingefallen.....

so gehts natürlich auch:
PHP:
$dir_file [$dirname] = $files;

(sieht sogar ein bißchen einfacher aus.... :) )

@comet: das ist nicht so ganz das, was er erreichen wollte..... Du liest nur ein Verzeichnis aus, und speicherst die Files in einem und die Folder in einem anderen Array. Guido wollte aber von einem Startverzeichnis aus alle Unterverzeichnisse aufsuchen, und dort alle Dateien auslesen und dem jeweiligen Verzeichnis zuordnen....


nichtsdestotrotz halte ich an meiner Aussage fest, daß die beste Lösung hier eine rekursive wäre..... schließlich ist das Problem, bzw. das Dateisystem, ein Baum, und Bäume lassen sich am idealsten mit rekursiven Algorithmen durchlaufen.... (natürlich kann man auch prozedural an sowas rangehen, aber dann muß man einen eigenen Stack programmieren, was fehleranfälliger und aufwändiger ist....)
 
geschafft!

Hallo zusammen!

@Albu
DANKE für den Tip mit dem + !
Ohne Dich wäre ich nie soweit gekommen!!!
Tja, aber dann musste ich doch erkennen, das der Moderator Recht hatte... ;)
Rekursion ist wirklich das angenehmste für so ein Problem!
Also gibt es jetzt ein neues Skript mit keinerlei Schwierigkeiten, aber vorerst wenigstens keinen neuen

@style-guide
Warum soll man sich mit kleinen Zielen zufrieden geben???
Das ist pädagogisch nicht richtig, sondern vielmehr lerntyp-abhängig.
Und leider sind die Ziele bei Köhntopp, Krause, php-center u.ä. entweder zu klein, oder schon wieder viel zu hoch!
Nochmal Danke für den Zend-Link - da gibts auch viel anderes zu finden!
JA, ich habe mir das Skript jetzt zusmmengeklaubt, aber wenn ich mich vorher nicht mit Arrays derart auseinander gesetzt hätte wäre ich nicht so weit gekommen.

Um nicht noch Ärger mit mo zu kriegen gibts den Code jetzt nur noch als Anhang!
Wer Verbesserungvorschläge anzubringen hat tue das !

THX und Ade
Guido
 

Anhänge

  • level_nav.txt
    1,4 KB · Aufrufe: 7
also bis auf die Tatsache, daß die zweite Schleife (foreach ($ar_tempfiles....... ) noch wegoptimiert werden könnte, bzw. die Abfrage is_dir ($sub.... in die obere if gezogen werden könnte, sollte das Ganze trotzdem seinen Dienst tun.... (ich habs zwar nicht getestet, aber optisch durchgeguckt... :) )

Die Zeile $ar_gesdirs[] = ""; verstehe ich zwar nicht ganz, aber egal...
 
Jo, seinen Dienst tuts! Für das Auslesen hab ich jetzt noch eigene Funktionen geschrieben. Jetzt hab ich jeweils nur a) die ordner b) die dateien in den Ordnern c) die unterordner und d) die Dateien in den Unterverzeichnissen. Eine schöne automatisierte Navigation ist am Start!

>> Die Zeile $ar_gesdirs[] = ""; verstehe ich zwar nicht ganz, aber egal...
Was verstehst du daran nicht???
Array wird angelegt.

Goodbye and thanks for all the fish
Guido
 
Guido schrieb:

>> Die Zeile $ar_gesdirs[] = ""; verstehe ich zwar nicht ganz, aber egal...
Was verstehst du daran nicht???
Array wird angelegt.
da $ar_gesdirs ein globales Array ist, hätte ich eher eine Initialisierung außerhalb der Funktion vorgezogen, so etwa:
PHP:
$ar_gesdirs = array ();
Dies erzeugt ein leeres Array.
Bei Deiner Variante wird jedesmal (d.h. einmal pro Verzeichnis) ein leerer String in die Liste aufgenommen, nur um dann wieder entfernt zu werden. Aber nur, wenn es ein Verzeichnis ist..... was passiert, wenn es eine Datei ist?? Dann hast Du plötzlich jede Menge Leerstrings drin....
 
Zurück
Oben