I have a nested array tree, generated from a flat array with the following function:
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]);
}
My flat array:
$flat = [
['id' => 9, 'parentId' => NULL, 'name' => 'Item 0'],
['id' => 1, 'parentId' => 9, 'name' => 'Item 1'],
['id' => 10, 'parentId' => 1, 'name' => 'Item 10'],
['id' => 100, 'parentId' => 10, 'name' => 'Item 100'],
['id' => 101, 'parentId' => 10, 'name' => 'Item 101'],
['id' => 2, 'parentId' => 9, 'name' => 'Item 2'],
['id' => 20, 'parentId' => 2, 'name' => 'Item 20'],
['id' => 200, 'parentId' => 20, 'name' => 'Item 200'],
['id' => 201, 'parentId' => 20, 'name' => 'Item 201'],
];
I would need to add an entry "NUMBER OF LEAVES" for each node of my array. This entry should count ALL the leaves of all the subnodes of the node.
My expected result:
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 ( )
)
)
)
)
)
)
)
)
$leaves
as passing it by reference will automatically declare it. – Proceeds