Spaziergang array rekursiv und drucken Sie den Pfad der Wanderung
Kann mir jemand helfen mit etwas code oder Anweisungen auf, wie man rekursiv ein array und bei erreichen des letzten Elements drucken Sie den vollständigen Pfad? Ein einfaches echo nicht arbeiten, weil ich passen den code an eine andere Funktion, die ich entwickle.
Die Funktion nicht, musst die array-dimension, da diese Parameter werden übergeben:
Beispiel:
$depth = 8;
$array[1][3][5][6][9][5][8][9];
Wenn-Funktion gelingt das 8. element print alle Weg:
//print path
'1 -> 3 -> 5 -> 6 -> 9 -> 5 -> 8 -> 9'
-
Wie gesagt, nur das drucken in diesem format arbeiten, weil ich implementieren Sie den code in einer anderen Funktion.
-
array Schlüssel den gleichen Wert haben können. Offensichtlich nicht den gleichen Wert in der gleichen Reihenfolge für die gesamte arary.
Aktualisiert:
Walk rekursiv-Funktion:
$someArray[1][2][3] = 'end';
$someArray[1][2][6] = 'end';
$someArray[1][3][6] = 'end';
$someArray[4][3][7] = 'end';
function listArrayRecursive(&$array_name, $ident = 0){
if (is_array($array_name)){
foreach ($array_name as $k => &$v){
if (is_array($v)){
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . "<br>";
listArrayRecursive($v, $ident + 1);
}else{
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . $v . "<br>";
}
}
}else{
echo "Variable = " . $array_name;
}
}
listArrayRecursive($someArray);
Drucken:
1 :
2 :
3 : end
6 : end
3 :
6 : end
4 :
3 :
7 : end
Nun, wie kann ich auch drucken, der Weg des Arrays jedesmal, wenn er das Ende erreicht? Zum Beispiel:
1 :
2 :
3 : end : path -> 1,2,3
6 : end : path -> 1,2,6
3 :
6 : end : path -> 1,3,6
4 :
3 :
7 : end : path -> 4,3,7
BEARBEITETEN CODE HINZUFÜGEN EINER DRITTEN PARAM AUFZEICHNEN DER PFAD:
$someArray[1][2][3] = 'end';
$someArray[1][2][6] = 'end';
$someArray[1][3][6] = 'end';
$someArray[4][3][7] = 'end';
$someArray[3][2] = 'end';
function listArrayRecursive(&$array_name, $ident = 0, $path = null){
foreach ($array_name as $k => &$v){
if (is_array($v)){
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . "<br>";
$path .= $k . ', ';
listArrayRecursive($v, $ident + 1, $path);
}else{
for ($i=0; $i < $ident * 10; $i++){ echo " "; }
echo $k . " : " . $v . ' - path -> ' . $path . "<br>";
}
}
}
listArrayRecursive($someArray);
Drucken:
1 :
2 :
3 : end - path -> 1, 2,
6 : end - path -> 1, 2,
3 :
6 : end - path -> 1, 2, 3,
4 :
3 :
7 : end - path -> 1, 4, 3,
3 :
2 : end - path -> 1, 4, 3,
- Gut, es ist die grundlegende Aufgabe zu lösen, mit Rekursion. Was haben Sie versucht?
- eigentlich habe ich diesen code für die Rekursion codepad.org/iyrcdfQP, aber Im stecken auf den Teil, auf den tracking-Pfad des aktuellen $ - Taste.
- Können Sie geben eine klare Beispiel, was mehrere Elemente innerhalb einer beliebigen Tiefe von array bzw., wenn das array nicht verschachtelt, so tief wie
$depth
? Welches problem ist dies die Lösung? - Yah, es wird nie die Tiefe, nur versuchen zu veranschaulichen. Wenn ich mit dem Skript die maximale Tiefe, die ich begegnen, wird wahrscheinlich 3 Ebenen. Wenn Sie überprüfen Sie den code auf den Kommentar oben sehen Sie, was Im tun mit ihm.
- codepad.viper-7.com/tW52eW
- Hast du post diese Frage schon gestellt? Der code sieht vertraut.
- Ich stellte den code und Ausführung hier: codepad.org/iyrcdfQP ... Es wird verwendet, um drucken Sie eine Menü und andere Dinge tun. Im Aufbau einer map array dynamisch erstellen von Menüs, Tabellen, Formulare für mich. In der ['map'] - Taste die Rekursion sollte nur zu Fuß zahlen, dass ist, warum ich is_number. Alle anderen Elemente gehen, um eine Einstellung zu der Ebene des Arrays ist. Die Tiefe wäre die dimension des Arrays. Und es wird verwendet, um drucken ein dropdown-Menü mit mehreren Dimensionen. Wie gesagt auf den Kommentar oben, diese sollten maximal 3 Dimensionen ...
- Sorry, ich habe. Seit Englisch ist nicht meine Muttersprache, ich habe Probleme, mich selbst auszudrücken. Wie ich immer Antwort bekomme, hier aber nicht auf diese Frage, dachte, ich könnte schreiben Sie die Bohrung Frage für eine bessere Erklärung ...
- Haben Sie getan, jede mod auf, dass code, den Sie umgebucht die URL? Konnte nicht gefunden werden. Vielen Dank,
- NÖ, es ist nur der gleiche code, aber ich bin mit viper7, denn das zeigt die Ausgabe als HTML statt Klartext.
- Ich sehe. Vielleicht Stimmen Sie zu löschen die andere Frage, bevor Sie diese bekommt-Flagge als exaktes Duplikat.
- ok, markiert, um gelöscht werden.
- Bitte nicht re-post mit der gleichen Frage. Wenn Sie brauchen, um re-word, dann neu-Wort-das original.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie beschäftigen eine
RecursiveIteratorIterator
( docs ), um die harte Arbeit aus der recursing durch die arrays.$iterator->hasChildren()
gibt true zurück, und der code tatsächlich nicht drucken, der Weg führte über das Blatt-Objekt. Ich fand einen workaround in meiner AntwortDiesem Beispiel zu geben, ist die Idee, nicht zur Lösung der eigentlichen Aufgabe.
Wenn keine übereinstimmung gefunden wird, wird null zurückgegeben.
Schrieb ich einfach eine Funktion, rekursive Schleife ein bisschen einfacher:
Ähnlich array_walk_recursive, aber mit einigen extra-Funktionen
Genannt, etwa so:
Einstellung rekursiv auf false gesetzt ist, wird nur die Bewertung der ersten Stufe.
Einstellung recursive auf true bewirkt, dass es zu durchqueren das gesamte array.
Einstellung rekursive in eine Ganzzahl dazu, dass es nur durchqueren, um die Tiefe.
Begehbar Funktionen verwiesen werden kann, oder übergeben Rückruf als anonyme Funktion.
(erwartet: Wert, Schlüssel, benutzerdefinierte Informationen)
Der zurückgegebene Wert ersetzen Sie den aktuellen Wert.
Benutzerdefinierte Daten können weitergegeben werden, und einige zusätzliche Informationen für Sie bereitgestellt.
Können Sie auf dem walk-Funktion, wenn Sie zusätzliche Informationen benötigen.
Hatte ich ähnliches problem. Hier ist eine Tiefe-Zuerst-Suche-ish-Lösung(kein Pfad Tiefe enthalten, es reicht bis zum Ende des Arrays). Kommentar der 'if' Anweisung, wenn u nicht wollen, zu zählen, den Wert:
Check hier den code
Kam ich mit der folgenden Funktion auf Basis von @salathe ist das eine. Es gibt ein array zurück, wo jedes element ist ein array, das Blatt mit dem index 0 und das array der Pfad der Schlüssel-index 1:
Der Hauptgrund, warum ich implementiert diese ist, dass
$iterator->hasChildren()
zurücktrue
wenn die aktuellen iterierten Blatt ist ein Objekt. Also, ich würde nicht in der Lage sein, um den Pfad, dass es der Weg.Können Sie fügen Sie einen Dritten parameter enthält den aktuellen Pfad als String. Am Ende können Sie die Ausgabe dann.