将多维数组递归到一维数组

时间:2018-09-17 00:54:53

标签: php arrays recursion multidimensional-array flatten

我有这个多维数组

$liste = [[1,2,3],5,[['x','y','z'],true]];

我想将其更改为一维数组

$liste = [1,2,3,5,'x','y','z',true];

所以我总是遇到一个问题,给我相同的形状

function to_array($list){
    $out=[];
    if(!is_array($list)){
        return $list;
    }else{
        foreach($list as $line){
            $out[]= to_array($line);
        }
    }
    return $out;
}

此递归函数的问题在哪里!!!

2 个答案:

答案 0 :(得分:1)

代码的问题是,当您要使用array_merge时,会将to_array的结果推送到$out中。现在,由于这需要两个参数都为数组,因此当$list不是数组时,您需要返回一个包含单个值的数组。因此,更改以下行:

    return $list;
        $out[]= to_array($line);

收件人:

    return array($list);
        $out = array_merge(to_array($line));

function to_array($list){
    $out=[];
    if(!is_array($list)){
        return array($list);
    }else{
        foreach($list as $line){
            $out = array_merge($out, to_array($line));
        }
    }
    return $out;
}

您将获得所需的结果:

var_export(to_array($liste));

输出:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 5,
  4 => 'x',
  5 => 'y',
  6 => 'z',
  7 => true,
)

答案 1 :(得分:1)

array_walk_recursive()通过单线不确定深度的数组提供期望的结果,因为它仅访问“叶节点”-有效地,您无需费心检查元素是否为不是数组。

array_walk_recursive()不返回数组,而是基于是否失败而返回true | false

&$flat是一个“通过引用传递”的变量。这意味着$flat可以充当将数据从功能范围内部传输到功能范围外部的工具。遍历元素时,每个新值都使用方括号语法推入$flat中。

这正是此功能最出色的地方-使用它。

代码:(Demo

$liste = [[1, 2, 3], 5, [['x', 'y', 'z'], true]];
array_walk_recursive($liste, function($v) use (&$flat){ $flat[] = $v; });
var_export($flat);

输出:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 5,
  4 => 'x',
  5 => 'y',
  6 => 'z',
  7 => true,
)