Fra*_*nck 4 php arrays tree nested
我有一个嵌套的数组树,它是由具有以下功能的平面数组生成的:
function convertToTree(array $flat, $idField = 'id',
$parentIdField = 'parentId',
$childNodesField = 'childNodes') {
$indexed = array();
// first pass - get the array indexed by the primary id
foreach ($flat as $row) {
$indexed[$row[$idField]] = $row;
$indexed[$row[$idField]][$childNodesField] = array();
}
//second pass
$root = null;
foreach ($indexed as $id => $row) {
$indexed[$row[$parentIdField]][$childNodesField][$id] =& $indexed[$id];
if (!$row[$parentIdField]) {
$root = $id;
}
}
return array($root => $indexed[$root]);
}
Run Code Online (Sandbox Code Playgroud)
我需要为数组的每个节点添加一个条目“ NUMBER OF LEAVES”。该条目应计算该节点所有子节点的所有叶子:
Array (
[9] => Array (
[id] => 9,
[parentId] => null,
[name] => Item 0,
[NUMBER OF LEAVES] => 4, (corresponding to leaves 100 and 101 + 200 and 201)
[childNodes] => Array
(
[1] => Array (
[id] => 1,
[parentId] => 9,
[name] => Item 1,
[NUMBER OF LEAVES] => 2, (corresponding to leaves 100 and 101)
[childNodes] => Array (
[10] => Array (
[id] => 10,
[parentId] => 1,
[name] => Item 10,
[childNodes] => Array (
[100] => Array (
[id] => 100,
[parentId] => 10,
[name] => Item 100,
[childNodes] => Array ( )
)
[101] => Array (
[id] => 101,
[parentId] => 10,
[name] => Item 101,
[childNodes] => Array ( )
)
)
)
)
)
[2] => Array (
[id] => 2,
[parentId] => 9,
[name] => Item 2,
[NUMBER OF LEAVES] => 2, (corresponding to leaves 200 and 201)
[childNodes] => Array (
[20] => Array (
[id] => 20,
[parentId] => 2,
[name] => Item 20,
[childNodes] => Array (
[200] => Array (
[id] => 200,
[parentId] => 20,
[name] => Item 200,
[childNodes] => Array ( )
)
[201] => Array (
[id] => 201,
[parentId] => 20,
[name] => Item 201,
[childNodes] => Array ( )
)
)
)
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
这可以解决您阵列中每个节点的“ NUMBER OF LEAVES”问题。该条目应计入该节点所有子节点的所有叶子”
它来自php 手册 $ food = array('fruits'=> array('orange','banana','apple'),'veggie'=> array('carrot','collard','pea')) ;
// recursive count
echo count($food, COUNT_RECURSIVE); // output 8
// normal count
echo count($food); // output 2`
Run Code Online (Sandbox Code Playgroud)
您可以轻松地做到这一点:
$leaves = 0;
array_walk_recursive($yourArray, function ($leaves) use (&$leaves) {
$leaves++;
});
Run Code Online (Sandbox Code Playgroud)
例子 :
$foods = array(
'fruits' => array('orange', 'banana', 'apple'),
'veggie' => array('carrot', 'collard', 'pea')
);
$leaves = 0;
array_walk_recursive($foods, function ($leaves) use (&$leaves) {
$leaves++;
});
echo $leaves; // will output 6
Run Code Online (Sandbox Code Playgroud)