Bademeister: Algorithmus optimieren

Beitrag lesen

Hi Flo.

Am Anfang steht was drin wie "./plugins/" oder "./classes/". Der Algorithmus geht nun diese Verzeichnisse durch und guckt, ob sie noch Unterverzeichnisse haben. Wenn ja werden auch diese wieder analysiert.

Da wirst Du Dir das Leben erheblich leichter machen, wenn Du die Funktion rekursiv aufrufst.

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?
2.: Warum willst Du eigentlich etwas aus einem Array (dem Array $check) entfernen?

Geht der Code noch effizienter/kürzer ohne Rekursion?

Ginge auch ein bisschen kuerzer ohne. Aber: Warum denn ohne?

Nochmal ein paar Sachen zum Code. Eins vorneweg: Er ist annaehernd unlesbar, weil nicht kommentiert. Da solltest Du Deine Gewohnheiten dringend aendern.

function autoload_paths_update() {

$check = $GLOBALS['autoload_paths'];

// Warum uebergibst Du $autoload_paths nicht als Parameter?

$new = array();
        while(count($check) > 0) {

// Du solltest per foreach-Schleife ueber das Array, das Du ausliest iterieren (s.o.), und in ein anderes Array Deine Ausgabe schreiben. Das erspart Dir einiges an Schleifen.

$add = array();
            $remove = array();
            foreach($check as $key=>$path) {
                $items = scandir($path);
                $subdirs = array();
                foreach($items as $item) {
                    if (is_dir($path.$item) && substr($item, 0, 1) != '.') {
                        $subdirs[] = $path.$item.'/';
                    }
                }

foreach($subdirs as $sd) {
                    $add[] = $sd;
                }

// wozu das Array $add bauen, wenn es am Ende == $subdirs ist, und wozu dann auchnoch so umstaendlich?

$remove[] = $key;
                $new[] = $path;
            }
            foreach($remove as $key) {
                unset($check[$key]);
            }
            foreach($add as $a) {
                $check[] = $a;
            }
        }

// Alles ueberfluessig, s.o.

$GLOBALS['autoload_paths'] = $new;

// NEIN, NEIN, NEIN!

}

  
Deine Funktion hat keine globalen Variablen zu veraendern - jedenfalls nicht, so lange der Benutzer der Funktion (das aufrufende Skript) das nicht explizit erlaubt, in dem er einen Pointer auf die Variable uebergibt. Lass die Funktion einfach ein Array mit den ganzen Verzeichnissen zurueckgeben. Und nenne sie dann danach, was sie eigentlich tut. Sie hat per se nichts mit irgendwelchem autoload zu tun, also nenne sie eher sowas wie scan\_paths\_recursive o.ae.  
  
Oder: Lass die Autoload-Funktion selber die ganze Arbeit machen und das erzeugte Array in einer statischen Variable speichern.  
  
  
Viele Gruesse,  
der Bademeister