array_push:我的递归展平数组函数似乎重置了最后的数组?

时间:2013-06-26 03:48:36

标签: php arrays

所以我试图创建一个递归的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。 我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

似乎您需要阅读variable scope。有两个变量称为$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);