Das Problem ist, dass man in einer Schleife nichts zum Array hinzufügen oder aus dem Array entfernen kann, über das man iteriert.
1.: Doch, das kann man. Warum sollte man es nicht koennen?
weil sich php z.B. merkt "ich bin beim 3. Element" und wenn du jetzt das 2 löschst, hast du als nächstes das 4. (original das 5.) und das ehemalige 4. damit übersprungenHui, jetzt ist mir schwindelig :-) Nein, ernsthaft - so stimmt das nicht ganz.
Wenn Du (vermeindlich) ueber Dein Array $check iterierst, dann iterierst Du in Wahrheit ueber eine Kopie davon, die zu Beginn erstellt wird. Wenn Du innerhalb der Schleife dann was am Array $check aenderst, dann hat das keinerlei Einfluss auf die Schleife, weil $check nichts (mehr) mit der Schleife zu tun hat.
Deine Bedenken koennten sich also hoechstens auf den Fall beziehen, in dem Du tatsaechlich die Struktur, ueber die Du tatsaechlich technisch iterierst, aendern wolltest. Das ist aber erstens sinnlos und zweitens in der Form, wie Du schreibst, annaehernd nicht moeglich. Nur mal so ganz theoretisch:
[...] Toll, nicht? :-)
Allerdings - und ich habe meinen Denkfehler gefunden. Ich arbeite normalerweise nicht mehr mit nativen Arrays, sondern mit einer Collection Klasse, die in einem Framework ist, an dem ich arbeite. Da ist es so, dass über die Klasse selber iteriert wird und nicht über eine Kopie derer (durch das Implementieren von Iterator? kann man mit foreach drüber iterieren).
Dort hatte ich das Problem bisher und hab garnicht bedacht, dass das bei Arrays nicht der Fall ist.
function get_dirs_recursive($directory) {
$new = array();
$items = scandir($directory); //we have all items - even files
foreach ($items as $item) { //now we iterate over $items
//and we only want to have directories not starting with an .
if (is_dir($directory.$item) && substr($item, 0, 1) != '.') {
//we add the current subdirectory...
$new[] = $directory.$item.'/';
//...and all the ones below
$new = array_merge($new, get_dirs_recursive($directory.$item.'/'));
}
}
return $new;
}
>
>
> Ich finde, das sieht schon mal deutlich besser aus als die erste Variante. Aber mal aus Interesse: was hast Du eigentlich vor? Soll dann die \_\_autoload-Funktion mal auf gut Glueck alle Dateien in Deinen gefundenen Pfaden einbinden, in der Hoffnung, dass irgendwo darin die gewuenschte Klasse definiert ist?
Nein. So nicht. Das wäre ja ein katastrophaler Designfehler. Die Dateien heißen bei mir <Classname>.class.php . Darin ist jeweils nur diese eine Klasse definiert. Jetzt ist es so, dass manche Klassen im Framework Scope liegen und manche Klassen in Application Scope - und damit in anderen Verzeichnissen.
Bisher war es einfach, da es genau 4 Verzeichnisse gab, wo Klassen liegen konnten. Jetzt werde ich aber verschiedene Sachen einbauen, wo es notwendig ist, dass Klassen auch in Unterverzeichnissen dieser Verzeichnisse liegen (z.B. liegen die Klassen eines Plugins im Verzeichnis dieses Plugins und nicht im allgemeinen Plugin-Verzeichnis). Also brauche ich alle diese Pfade.
In der Hoffnung, dass nicht alles Hirnlos geklungen hat,

--
ie:{ br: fl:( va:) ls:& fo:| rl:( n4:( de:] ss:) ch:| js:| mo:| sh:( zu:)