我需要遍歷以下類型的結構:用PHP遞歸函數版本
P
/ | \
E1 E2 E3 .....
/\ /\ |
V1 V2 V1 V2 V3 .....
| | | | /\
T1 T2 T3 T4 T5 T6 .....
爲了形成包含下列元素的關聯數組:這裏
V1(key) = [T1(E1), T3(E2), ...]
V2(key) = [T2(E1), T4(E2), ...]
V3(key) = [T5(E3), T6(E3), ...]
.....
現在到了棘手部:結構實際上被簡化了。我事先不知道需要處理多少個E級節點(圖中的3個),或者每個節點有多少個V級節點(但至少有1個節點在那裏),此外,每個V級節點也可以具有多個T節點。
我嘗試使用遞歸函數來做到這一點(在PHP中)。我會簡化代碼,因爲它對於一些對討論無關緊要的對象有奇怪的方法。我目前的嘗試結果如下:
V1(key) = [T1(E1)]
V2(key) = [T2(E1)]
我認爲這意味着遍歷只發生在第一個E級「分支」上。
這是我的代碼:
$result = [];
$traverser = function($node) use (&$traverser, &$result) {
$children = $node->getChildrenArray();
foreach($children as $key=>$child){
if ($child->nodeType() == 'v_node') {
$v_node_key = $child->name;
$t_nodes = $child->getChildrenArray();
if (!array_key_exists($v_node_key, $results)){
$results[$v_node_key] = [];
}
foreach($t_nodes as $keyt=>$t_node) {
$info_array = $t_node->toArray();
array_push($results[$v_node_key], $info_array);
}
} else if ($child->nodeType() == 'e_node') {
// keep digging
return $traverser($child);
}
}
};
$traverser($p_node);
我認爲問題是,一旦我稱之爲foreach
內$traverser
功能也不會回來,從以前的狀態恢復。
任何人都可以建議我應該如何解決這個問題以得到我放在上面的結果嗎?
這有助於解決問題嗎?我希望你知道他的代碼**是一個有效的匿名函數**,並且他實際上正在與算法而不是語法進行鬥爭? –