您可能希望通過執行遞歸函數來最小化傳遞函數的數量,這可能會讓您自己爲之後的嚴重性能問題而自行設置。通過一次傳遞並使用引用,您可以使其運行速度非常快並且工作得非常好。內存使用率也會比原始數據集略高,因爲一切都是通過引用完成的,而不是通過複製完成的。如果更新其中一條記錄,則所有記錄都會隨之更新。
輸入數組
$rows = [
[ 'id' => 1, 'parent' => null ],
[ 'id' => 2, 'parent' => 1 ],
[ 'id' => 3, 'parent' => 1 ],
[ 'id' => 4, 'parent' => 2 ],
[ 'id' => 5, 'parent' => 3 ],
[ 'id' => 6, 'parent' => 4 ],
[ 'id' => 7, 'parent' => 5 ],
[ 'id' => 8, 'parent' => 6 ],
[ 'id' => 9, 'parent' => 7 ],
[ 'id' => 10, 'parent' => 8 ],
];
變量在這裏您可以存儲您的參考
$tree = [];
循環記錄集
foreach($rows as $row) {
檢查這裏看到,如果你已經添加了此行,從理論上講,除非你有重複的條目
if (
false === array_key_exists($row['id'], $tree) ||
false === array_key_exists('data', $tree[$row['id']])
) {
$tree[$row['id']]['data'] = $row;
}
檢查,看看你這個應該總是回來真有父母,然後如果父母已添加和/或如果孩子已初始化
if (
$row['parent'] &&
(
false === array_key_exists($row['parent'], $tree) ||
false === array_key_exists('children', $tree[$row['parent']])
)
) {
$tree[$row['parent']]['children'] = [];
}
增加孩子的引用到父,格外小心,注意&它說,這是通過參考
if ($row['parent']) {
$tree[$row['parent']]['children'][] = &$tree[$row['id']];
}
}
$樹成爲下
[
1 =>
[
'data' =>
[
'id' => 1,
'parent' => NULL,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 2,
'parent' => 1,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 4,
'parent' => 2,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 6,
'parent' => 4,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 8,
'parent' => 6,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
],
],
],
],
],
],
],
],
1 =>
[
'data' =>
[
'id' => 3,
'parent' => 1,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 5,
'parent' => 3,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 7,
'parent' => 5,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 9,
'parent' => 7,
],
],
],
],
],
],
],
'name' => 'test',
],
],
],
2 =>
[
'data' =>
[
'id' => 2,
'parent' => 1,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 4,
'parent' => 2,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 6,
'parent' => 4,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 8,
'parent' => 6,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
],
],
],
],
],
],
],
],
3 =>
[
'data' =>
[
'id' => 3,
'parent' => 1,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 5,
'parent' => 3,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 7,
'parent' => 5,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 9,
'parent' => 7,
],
],
],
],
],
],
],
'name' => 'test',
],
4 =>
[
'data' =>
[
'id' => 4,
'parent' => 2,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 6,
'parent' => 4,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 8,
'parent' => 6,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
],
],
],
],
],
],
5 =>
[
'data' =>
[
'id' => 5,
'parent' => 3,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 7,
'parent' => 5,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 9,
'parent' => 7,
],
],
],
],
],
],
6 =>
[
'data' =>
[
'id' => 6,
'parent' => 4,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 8,
'parent' => 6,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
],
],
],
],
7 =>
[
'data' =>
[
'id' => 7,
'parent' => 5,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 9,
'parent' => 7,
],
],
],
],
8 =>
[
'data' =>
[
'id' => 8,
'parent' => 6,
],
'children' =>
[
0 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
],
],
9 =>
[
'data' =>
[
'id' => 9,
'parent' => 7,
],
],
10 =>
[
'data' =>
[
'id' => 10,
'parent' => 8,
],
],
]
感謝您的詳細解答。如果您將大量數據作爲輸入數組「$ rows」執行,會發生什麼情況。我需要獲取上述屏幕截圖中提到的特定小孩的所有頂級數據。我想獲取每個特定ID的父ID,並保持它直到父母爲NULL。你認爲你可以爲我的特定需求提供可行的樣本嗎?我將非常感謝您的幫助和支持 –