从无限多维数组级别计算

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.