Rekursion und der übergabe by reference
Habe ich einen Baum von Kategorien, die der folgenden Struktur:
[6] => Array
(
[id] => 6
[name] => computers
[productCount] => 0
[children] => Array
(
[91] => Array
(
[id] => 91
[name] => notebook
[productCount] => 5
[children] => Array
(
)
)
[86] => Array
(
[id] => 86
[name] => desktop
[productCount] => 0
[children] => Array
(
)
)
)
)
Neben einer Unterkategorie und mit jeder Kategorie können die Produkte enthalten (wie ein Ordner kann Unterordner enthalten und nur Dateien).
Ich bin versucht zu schreiben Sie eine rekursive Funktion, die ich will nehmen Sie dieses array als Referenz und Streifen sowohl die Blatt-Kategorien mit [productCount] = 0 und alle übergeordneten Kategorien, die enthalten, wie leere Knoten. In anderen Worten, nach der Verarbeitung möchte ich nur die Kategorien, die halten Produkte auf alle Unterebenen.
Habe ich schrieb einige code, jetzt Debuggen und es nicht strip leeren Knoten. Kann sein, ich bin nicht mit Referenzen richtig. Bitte helfen Sie mir, es zu beheben, wenn möglich.
function pruneTree( & $node) {
if ( ! $node['children'] && ! $node['productCount']) {
unset($node);
}
if ( ! empty($node['children'])) {
foreach ($node['children'] as $key => $child) {
pruneTree($node['children'][$key]);
}
}
return;
}
- Ist
array() == false
? - Ja, in PHP ein leeres array wird als falsy.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie auch ändern Sie die parameter in die Funktion ein array von Knoten, nicht auf einen einzelnen Knoten. Dadurch ändert sich die Rekursion leicht, und verhindert die Notwendigkeit, weitergeben Schlüssel:
Außerdem wurde eine zusätzliche Prüfung, die sicherstellt, dass, wenn alle untergeordneten Knoten beschnitten, die Eltern (jetzt -, Blatt -) Knoten wird auch beschnitten.
Hoffe, das hilft!
Test data:
Der Aufruf:
unset($nodes[$key]);
innerhalb einer Funktion zu ändern, die ursprüngliche array wird per Referenz übergeben, weil es einfach unset die Referenz-variable innerhalb der Funktionsumfang.pruneTree($nodes[$key]['children']);
.unset
löscht nur die Referenz, nicht aber die referenzierten variable:Also du musst das parent-array und die Schlüssel zu löschen, die variable:
unset
und den Umfang.Ich würde das tun. Beachten Sie das "&" in der foreach.
Ich weiß nicht, ob dies der Fall ist, aber wenn ich brauchte, um die Werte zu ändern, die rekursiv in array, die ich brauchte, um pass & foreach Wert.