多维数组递归到一维数组

multidimensional array to one dimensional array recursively

我有这个多维数组

$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;
}

这个递归函数哪里有问题!!!

您的代码的问题是您将 to_array 的结果推入 $out,而您想要做的是使用 array_merge。现在因为这要求两个参数都是数组,当 $list 不是数组时,您需要 return 一个包含单个值的数组。所以更改这些行:

    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,
)

array_walk_recursive() 在一行中从不确定深度的数组中提供所需的结果,因为它只访问 "leaf-nodes" —— 实际上,您不需要费心检查元素是否是或不是数组。

array_walk_recursive() 不是 return 数组,它 returns true|false 基于是否有失败。

&$flat是一个变量"passed by reference"。这意味着 $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,
)