can anyone intelligent here help me regarding making function for calculating unlimited levels of childs in array?
below if you see i have 3 levels in array such as child in child in child of parent "A". so far i'm using php for-loop
to go through each level of array and doing some calculation that should be understandable from below function example_TreeCalc
. basically i'm going in all levels of array and summing revPoints
and revPoints_calculated
in two different variables. and later i am subtracting them.
PS: my friend told me to solve this by DFS. i checked that algorithm but couldn't find a way to do those calculations via DFS. if someone willing to create any example of doing below calculation via given array using DFS. I will highly appreciate that as well.
Thank you!
$example_Tree = array(
'name' => 'A',
'revPoints' => '300.00',
'revPoints_calculated' => '120.00',
'child'=> array(
array(
'name' => 'B',
'revPoints' => '250.00',
'revPoints_calculated' => '30.00',
'child' => array(
array(
'name' => 'C',
'revPoints' => '0.00',
'revPoints_calculated' => '0.00',
'child' => array()
),
array(
'name' => 'D',
'revPoints' => '250.00',
'revPoints_calculated' => '10.00',
'child' => array()
),
array(
'name' => 'E',
'revPoints' => '1150.00',
'revPoints_calculated' => '92.00',
'child' => array()
),
)
),
array(
'name' => 'C',
'revPoints' => '1200.00',
'revPoints_calculated' => '541.00',
'child' => array(
array(
'name' => 'D',
'revPoints' => '2000.00',
'revPoints_calculated' => '160.00',
'child' => array()
),
array(
'name' => 'E',
'revPoints' => '3500.00',
'revPoints_calculated' => '420.00',
'child' => array()
),
array(
'name' => 'F',
'revPoints' => '850.00',
'revPoints_calculated' => '34.00',
'child' => array()
),
array(
'name' => 'G',
'revPoints' => '150.00',
'revPoints_calculated' => '0.00',
'child' => array()
),
)
),
array(
'name' => 'D',
'revPoints' => '800.00',
'revPoints_calculated' => '100.00',
'child' => array(
array(
'name' => 'E',
'revPoints' => '300.00',
'revPoints_calculated' => '12.00',
'child' => array()
),
array(
'name' => 'F',
'revPoints' => '300.00',
'revPoints_calculated' => '12.00',
'child' => array()
),
array(
'name' => 'G',
'revPoints' => '150.00',
'revPoints_calculated' => '0.00',
'child' => array()
),
)
),
array(
'name' => 'E',
'revPoints' => '100.00',
'revPoints_calculated' => '0.00',
'child' => array(
array(
'name' => 'F',
'revPoints' => '800.00',
'revPoints_calculated' => '32.00',
'child' => array()
),
array(
'name' => 'G',
'revPoints' => '350.00',
'revPoints_calculated' => '76.00',
'child' => array(
array(
'name' => 'H',
'revPoints' => '800.00',
'revPoints_calculated' => '32.00',
),
array(
'name' => 'I',
'revPoints' => '100.00',
'revPoints_calculated' => '0.00',
),
)
),
)
),
),
);
dump($example_Tree);
function example_TreeCalc($tree) {
$treeParent = $tree['name'];
$revPercentTotal = 0;
$revTotal = 0;
$childTree_level_1 = $tree['child'];
// dump('child Tree level 1=>', count($childTree_level_1));
if (isset($childTree_level_1)) {
for ($i=0; $i < count($childTree_level_1); $i++) {
$childTree_level_2 = $childTree_level_1[$i]['child'];
// dump('child Tree level 2=>', count($childTree_level_2));
if (isset($childTree_level_2)) {
for ($j=0; $j < count($childTree_level_2); $j++) {
$childTree_level_3 = $childTree_level_2[$j]['child'];
// dump('child Tree level 3=>', count($childTree_level_3));
if (isset($childTree_level_3)) {
for ($k=0; $k < count($childTree_level_3); $k++) {
$revPercentTotal += $childTree_level_3[$k]['revPoints_calculated'];
$revTotal += $childTree_level_3[$k]['revPoints'];
}
}
$revPercentTotal += $childTree_level_2[$j]['revPoints_calculated'];
$revTotal += $childTree_level_2[$j]['revPoints'];
}
}
$revPercentTotal += $childTree_level_1[$i]['revPoints_calculated'];
$revTotal += $childTree_level_1[$i]['revPoints'];
}
}
echo "BEFORE revPercentTotal $revPercentTotal" . "<br/>";
echo "BEFORE revTotal $revTotal" . "<br/>";
// $revPercentTotal += $tree['revPoints_calculated'];
// $revTotal += $tree['revPoints'];
echo "revTotal $revTotal " . "<br/>";
echo "revPercentTotal $revPercentTotal" . "<br/>";
$commission = number_format($revTotal - $revPercentTotal,2);
return array('Name'=> $treeParent, 'Commission'=> $commission);
}
dump(exampleTreeCalc($example_Tree));
If no other logic than plain summation is involved you can use array_walk_recursive
:
$revPercentTotal = 0;
$revTotal = 0;
array_walk_recursive($example_Tree, function ($value, $key) use (&$revPercentTotal, &$revTotal) {
if ($key === 'revPoints_calculated') {
$revPercentTotal += $value;
} elseif ($key === 'revPoints') {
$revTotal += $value;
}
});
$commision = number_format($revTotal - $revPercentTotal, 2);
Here is the demo.