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]);
}
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 :
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 ( )
)
)
)
)
)
)
)
)
this could solve your problem of "NUMBER OF LEAVES" for each node of my array. This entry should count ALL the leaves of all the subnodes of the node"
its from php manual `$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`
You can do it easily as :
$leaves = 0;
array_walk_recursive($yourArray, function ($leaves) use (&$leaves) {
$leaves++;
});
Example :
$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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With