【问题标题】:Transpose and flatten multiple rows of array data [duplicate]转置和展平多行数组数据
【发布时间】:2017-09-22 22:27:38
【问题描述】:

是否有本地 PHP 函数来压缩合并两个数组?

看下面的例子:

$a = array("a","b","c");
$b = array("d","e","f");
$c = array("g","h","i");

var_dump(array_merge($a,$b,$c));

这会产生:

array(9) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "f"
  [6]=>
  string(1) "g"
  [7]=>
  string(1) "h"
  [8]=>
  string(1) "i"
}

随心所欲:

array(9) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "d"
  [2]=>
  string(1) "g"
  [3]=>
  string(1) "b"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "h"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "f"
  [8]=>
  string(1) "i"
}

在此之前我编写了自己的 - 测试了一个有效的 - 功能:

function array_zip(...$arrays) {
    $res = array();

    while(true) {
        $check_finish = true;
        foreach($arrays as $array) {
            if(!empty($array)) {
                $check_finish = false;
            }
        }

        if($check_finish) {
            break;
        } else {

            foreach($arrays as $key => $array) {
                if(!empty($array)) {
                    array_push($res,array_shift($array)); 
                    $arrays[$key] = $array;
                }
            }
        }
    }

    return $res;
}

但是,有没有原生的 PHP 函数来合并这样的数组(也许性能更高)?是否有一个用于此目的的原生 PHP 函数可以保留密钥但保持顺序?没找到 :-/

【问题讨论】:

标签: php arrays transpose flatten array-merge


【解决方案1】:

没有用于此目的的 PHP 原生函数。然而,根据@Mark Ba​​ker 的评论,实现这一点的可能性很小:

$a = array("a","b","c");
$b = array("d","e","f");
$c = array("g","h","i");

function array_zip(...$arrays) {
    return array_merge(...array_map(null, ...$arrays));
}

var_dump(array_zip($a,$b,$c));

【讨论】:

  • 这是同一事物的不同版本:function array_zip() { return array_merge(...array_map(null, ...func_get_args())); } ...虽然我只是在我自己的项目中使用你的方式。 ...只是想我会提到它。此外,如果您删除自定义函数调用,您可以减少使用的展开运算符的数量。 var_dump(array_merge(...array_map(null, $a, $b, $c)));
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2018-08-31
  • 2022-09-30
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多