PHP Frage zu Rekursion und Arrays

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo,

ich hab eine kurze Frage zu Rekursion und Arrays. :(

Folgende Funktion:
PHP:
function gen($id = 0,$cnt = 0) {
	$Result = array();
	$all = mysql_query("SELECT * FROM site WHERE s_parent = $id;");
	while($erg = mysql_fetch_array($all)) {
		if($erg['s_isfolder'] == 1) {
			$cnt_A = $cnt++;
			$Result[] =  array( $erg['s_menu_title'] , $erg['pos'] , gen($erg['s_id'],$cnt_A) );
		} else {
			$Result[] =  array($erg['s_menu_title'],$erg['pos'] ,  0);
		}
	}
	return $Result;
}
generiert mir aus folgendem Datenbankeintrag:
Code:
s_id | s_isFolder | s_parent | pos(ition) | s_menu_title
1  	1  	0  	1  	Seite 1
2 	0 	1 	2 	Unterseite 1
3 	0 	1 	1 	Unterseite 2
4 	0 	0 	2 	Seite 2
5 	0 	0 	3 	Seite 3
den folgenden Array:
PHP:
Array
(
    [0] => Array
        (
            [0] => Seite 1
            [1] => 1
            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => Unterseite 1 
                            [1] => 2
                            [2] => 0
                        )

                    [1] => Array
                        (
                            [0] => Unterseite 2
                            [1] => 1
                            [2] => 0
                        )

                )

        )

    [1] => Array
        (
            [0] => Seite 2
            [1] => 2
            [2] => 0
        )

    [2] => Array
        (
            [0] => Seite 3
            [1] => 3
            [2] => 0
        )

)

Nun möchte ich den Array zunächst durchlaufen - durch jedes Element einmal durchgehen, um z.B. später daraus eine ul-li-Liste in dem Folgenden Format zu erstellen:
Code:
Seite 1
      * Unterseite 2
      * Unterseite 1
Seite 2
Seite 3
Wie mache ich das? Jeder Array ist folgendermaßen Aufgeteilt: array( Titel, Position, Kinder)

Wie Ihr sehen könnt, gibt es bei mir auch soetwas wie Position. Ich muss es irgendwie schaffen, den Array nach den Positionszahlen auf dieser Ebene zu sortieren! Hat jemand da eine Idee??

Ich bin dankbar für jede Hilfe :(
CPU
 
Versuchs mal so:


function render($menuArr){
echo "<li>".$menuArr[0];
if(is_array($menuArr[2]){
echo "<ul>.render($menuArr[2])."</ul>";
}
echo "</li>
}

echo "<ul>";
foreach($Result as $menuElement){
render($menuElement);
}
echo "</ul>";
 
Warum sortierst du nicht gleich im SQL?

"SELECT * FROM site WHERE s_parent = $id ORDER BY pos"

oder

"SELECT * FROM site WHERE s_parent = $id ORDER BY s_isfolder, pos"
oder sowas in der Art. Da hätteste schon mal ein Problem recht elegant gelöst. :)
 
Hallo CPU,

erst einmal würde ich die Keys im Array benennen. Du wirst selbst nachher nicht mehr durchblicken, wenn alles Zahlen sind.

Die ursprüngliche Sortierung solltest du per SQL-Query vornehmen.

Danach gehst du Mittels for()-Schleife durch das $resultArray und prüfst dann eben, ob der Schlüsselt "Untermenüs" vorhanden bzw. Werte enthält (sizeof($resultArray[$i]['untermenu'] > 0), wenn ja, ein for bzw. foreach auf dieses Array wo du die Daten des Untermenüs ausgibst...
 
Tja, ist ja schön und gut, doch wie soll ich das mit SQL schon vorsortieren??
Die Positionen gelten ja nur für eine Ebene:
Code:
Ebene 1:
Seite 1 (1)
....
Seite 2 (2)
Seite 3 (3)

Ebene 2:
...
      * Unterseite 2 (1)
      * Unterseite 1 (2)
...

Ich hatte mir überlegt, dass man erst aus der Datenbank einen "Hauptarray" erstellt, dann hingeht, diesen rekursiv durchläuft und nach Positionen sortiert (Position dann aus dem Array entfernt) und dann mit dem schönen Skript von IgG sortiert ausgibt (wenn es funktioniert ... hab's noch nicht getestet).

Wie soll ich es denn sonst lösen? :)
 
Auf den Ersten Blick scheint es zu funktionieren mit "SQL ORDER BY", aber auf den Zweiten ... ?
 
Die Sortierung mit ORDER BY müsste gehen, da die Parent/Child Beziehung später durch dein Script wiederhergestellt ist, aber die Sortierung nach Zahlen ja gerne global erfolgen kann, stört ja an sich nicht.

Allerdings wäre ich da trotzdem eher vorsichtig.

Ansonsten schau dir mal example #3 auf folgender Seite an:
http://de3.php.net/manual/en/function.array-multisort.php
 
Naja das evt. manches nicht wie gewünscht sortiert wird. Bei Deiner Methode aber eher unwahrscheinlich. Es sei denn die pos-Zahlen oder andere Werte sind inkorrekt. Aber das wäre bei einer Array-Sort-Variante auch Voraussetzung.
 
Zurück
Oben