【问题标题】:multidimensional array to one dimensional array recursively多维数组递归到一维数组
【发布时间】:2019-02-20 21:31:16
【问题描述】:

我有这个多维数组

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

这个递归函数的问题在哪里!!!

【问题讨论】:

标签: php arrays recursion multidimensional-array flatten


【解决方案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,
)

【讨论】:

    【解决方案2】:

    您的代码的问题是您将to_array 的结果推送到$out,而您想要做的是使用array_merge。现在因为这要求两个参数都是数组,所以当$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,
    )
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2017-11-28
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多