array_push:我的递归扁平数组函数似乎重置了最终数组


array_push: my recursive flatten array function seems to reset the final array?

所以我试图创建一个递归的flattenArray函数,它将接受一个数组(具有未知数量的元素和子数组(可能具有更多的子数组))。

以下是我遇到麻烦的PHP代码:

<?php
// Javascript Array [ [1,2,3],[[[4]]],[5],[6],[[7,8,[9]]] ]
// Equivalent PHP Array:   
$sampleArray = Array(
    Array(1,2,3),
    Array(
        Array(
            Array(4)
        )
    ),
    Array(5),
    Array(6),
    Array(
        Array(
            7,
            8,
            Array(9)
        )
    )
);
$finishedArray = Array();
function flattenArray($array){
    foreach ($array as $key => $value) {
        if(is_array($value)){
            flattenArray($value);
        } else {
            $finishedArray[] = $value;
            echo "<br> ".$value." | ";
            print_r($finishedArray);
        }
    }
}
flattenArray($sampleArray);
echo "<br><br>FinishedArray: <br>";
print_r($finishedArray);
?>

我得到这个输出:

1 | Array ( [0] => 1 ) 
2 | Array ( [0] => 1 [1] => 2 ) 
3 | Array ( [0] => 1 [1] => 2 [2] => 3 ) 
4 | Array ( [0] => 4 ) 
5 | Array ( [0] => 5 ) 
6 | Array ( [0] => 6 ) 
7 | Array ( [0] => 7 ) 
8 | Array ( [0] => 7 [1] => 8 ) 
9 | Array ( [0] => 9 ) 
FinishedArray: 
Array ( )

出于某种原因,它会重置$finishedArray。我在这里做错了什么?

似乎您需要了解变量范围。有两个名为$finishedArray的变量,一个在主脚本中,另一个在函数中。可能最简单的解决方案是通过引用传递:

function flattenArray($array, &$finishedArray){
    foreach ($array as $key => $value) {
        if(is_array($value)){
            flattenArray($value, $finishedArray);
        } else {
            $finishedArray[] = $value;
        }
    }
}
$finishedArray = Array();
flattenArray($sampleArray, $finishedArray);