当前位置:  开发笔记 > 编程语言 > 正文

如何在PHP中将多维数组"扁平化"为简单数组?

如何解决《如何在PHP中将多维数组"扁平化"为简单数组?》经验,为你挑选了6个好方法。

这可能是初学者的问题,但我已经阅读了较长时间的文档,我找不到任何解决方案.我以为我可以为每个维度使用implode然后将这些字符串重新组合在一起str_split以创建新的简单数组.但是我永远不知道连接模式是否也不在值中,因此在执行之后str_split我的原始值可能会中断.

combine($array1, $array2)对于多维数组中的数组是否有类似的东西?



1> Prasanth Ben..:
$array  = your array

$result = call_user_func_array('array_merge', $array);

echo "
";
print_r($result);

参考:http://php.net/manual/en/function.call-user-func-array.php

这是另一种解决方案(适用于多维数组):

function array_flatten($array) {

   $return = array();
   foreach ($array as $key => $value) {
       if (is_array($value)){ $return = array_merge($return, array_flatten($value));}
       else {$return[$key] = $value;}
   }
   return $return;

}

$array  = Your array

$result = array_flatten($array);

echo "
";
print_r($result);


从php5.3开始,您现在可以使用splat运算符:`$ result = array_merge(... $ array);`https://www.php.net/manual/zh/migration56.new-features.php#migration56。新功能

2> Arnold Roa..:

这是一条线,SUPER易于使用:

$result = array();
array_walk_recursive($original_array,function($v) use (&$result){ $result[] = $v; });

在匿名函数/闭包中很容易理解.$v是你的价值$original_array.


这是唯一一个在两级数组中为我工作的方法.

3> Luc M..:

使用 array_walk_recursive

 array());

array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp);

var_dump($objTmp->aFlat);

/*
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
  [10]=>
  int(11)
}
*/

?>

用PHP 5.5.9-1ubuntu4.24(cli)测试(内置:2018年3月16日12:32:06)


为什么这个答案提到使用`array_values()`?我根本看不到在答案中涉及的任何功能.
@jskilski对象(本例中为`$ objTmp`)自动通过引用传递; 数组不是.尝试使用匿名函数(http://php.net/manual/en/functions.anonymous.php)而不是`create_function`.

4> 小智..:
// $array = your multidimensional array

$flat_array = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){

$flat_array[$k] = $v;

}

还记录了:http: //www.phpro.org/examples/Flatten-Array.html


注意:仅用于基元数组."RecursiveArrayIterator将所有对象视为拥有子对象,并尝试将它们递归到它们中." http://www.php.net/manual/en/class.recursivearrayiterator.php#106519
我知道这是旧的但仍然有用,但是$ k需要被一些独特的东西取代,例如计数器.如果内部数组中的名称与主要名称相同,则仅使用$ k会导致元素被删除.

5> chaos..:
function flatten_array($array, $preserve_keys = 0, &$out = array()) {
    # Flatten a multidimensional array to one dimension, optionally preserving keys.
    #
    # $array - the array to flatten
    # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
    # $out - internal use argument for recursion
    foreach($array as $key => $child)
        if(is_array($child))
            $out = flatten_array($child, $preserve_keys, $out);
        elseif($preserve_keys + is_string($key) > 1)
            $out[$key] = $child;
        else
            $out[] = $child;
    return $out;
}



6> SamGoody..:

PHP的用户评论(简化)和此处的另一种方法:

function array_flatten_recursive($array) { 
   if (!$array) return false;
   $flat = array();
   $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
   foreach ($RII as $value) $flat[] = $value;
   return $flat;
}

这种方法的最大好处是它可以跟踪递归的深度,如果在展平时需要它.
这将输出:

$array = array( 
    'A' => array('B' => array( 1, 2, 3)), 
    'C' => array(4, 5) 
); 
print_r(array_flatten_recursive($array)); 

#Returns: 
Array ( 
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
)


注意:仅用于基元数组."RecursiveArrayIterator将所有对象视为拥有子对象,并尝试将它们递归到它们中." http://www.php.net/manual/en/class.recursivearrayiterator.php#106519
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有