如何将多维数组扁平化?

374

在PHP中,是否有可能在不使用递归或引用的情况下将(双/多)维数组展开?

我只对值感兴趣,可以忽略键,我考虑使用array_map()array_values()来实现。


18
为什么要避免使用递归?递归指的是一个函数在其内部调用自身。虽然递归能够解决某些问题,但它也有缺点。首先,递归需要更多的内存空间,因为每次函数调用时都会创建一个新的栈帧。如果递归层数过多,就会导致栈溢出。此外,递归通常比迭代执行速度慢,因为每次调用都需要一定的开销。因此,在编写代码时,应该尽可能避免使用递归,除非递归是必须的或者使用递归可以使代码更加清晰易懂。 - JorenB
6
主要是重复的问题 https://dev59.com/oXRB5IYBdhLWcg3wv5o_ - cletus
4
如果你想处理任意深度的数组中的所有元素,没有递归是不可能的(虽然你可以把它伪装成迭代,但本质上并没有区别)。如果你只是想避免自己编写递归处理代码,可以使用http://dk2.php.net/manual/en/function.array-walk-recursive.php函数,并提供一个回调函数将元素添加到可用的数组中(使用全局变量、userdata参数、将其全部放在一个类中并引用$this等方法均可) 。 - Michael Madsen
@JorenB:我希望能看到一个实现可以被实现的情况。 - Alix Axel
请查看Nspl中的flatten函数。您还可以使用它来指定深度。 - Ihor Burlachenko
31个回答

-1

这是我的解决方案,使用引用:

function arrayFlatten($array_in, &$array_out){

    if(is_array($array_in)){
        foreach ($array_in as $element){
               arrayFlatten($element, $array_out);
        }
    }
    else{
        $array_out[] = $array_in; 
    }
}

$arr1 = array('1', '2', array(array(array('3'), '4', '5')), array(array('6')));

arrayFlatten($arr1, $arr2);

echo "<pre>";
print_r($arr2);
echo "</pre>";

1
请在您的代码片段中包含一些解释,说明它是如何工作的以及为什么这是一个好主意。仅提供代码的答案在StackOverflow上的价值较低,因为它们无法很好地教育/赋能OP和未来的研究人员。请记住,我们不仅仅是在与OP交流;旧页面用于关闭新页面,因此页面需要足够详细,以便为未来的提问者解决问题。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接