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 übersprungen
Hui, 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:
In einem bestimmten Schleifendurchlauf hast Du i.a. keinerlei Zugriff mehr auf die aktuellen Werte der vorherigen Schleifendurchlaeufe. Mittels der von Dir im Schleifenkopf festgelegten Variable - etwa $thisValue in
(foreach $array as $thisValue) ... -
hast Du Zugriff auf das aktuelle Element, das wars. Um es ueberhaupt zu schaffen, an Werte, ueber die Du bereits iteriert hast, ranzukommen, muesstest Du in dem vorherigen Durchlauf einen Pointer auf $thisValue speichern, etwa
$pointer = &$thisValue;
Das an sich nuetzt auch noch nichts, weil schlicht und einfach dieselbe Variable $thisValue (an derselben Speicheradresse) im naechsten Schleifendurchlauf mit dem aktuellen Wert ueberschrieben wird. Was geht, ist, den Pointer zu setzen und dann $thisValue zu loeschen:
$pointer = &$thisValue;
unset($thisValue);
Dann wird $thisValue im naechsten Schleifendurchlauf wieder neu (und an anderer Speicheradresse) erzeugt, und $pointer zeigt immer noch auf den alten Speicherplatz. Wenn Du an dem was rumdoktorst, hat es aber auch keinen Einfluss auf den weiteren Verlauf der Iteration. Und ein Skript, das das macht, ist ein Anwaerter fuer den Preis des daemlichsten Skriptes aller Zeiten. Und wenn ich gewusst haette, wie lang die Sache hier wird, haette ich stattdessen lieber Daeumschen gedreht. ;-) Der Rede kurzer Sinn: Deine Bedenken im Hinblick auf das Veraendern eines Arrays innerhalb des Iterationsvorgenages sind unbegruendet. Toll, nicht? :-)
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?
Viele Gruesse,
der Bademeister