php - 解释这个数组转置和展平函数是如何工作的

标签 php function transpose flatten array-filter

PHP 中的这个函数允许合并任意 N 个不同长度的数组,输出数组将按下一个顺序排列:Array1[0],Array2[0],..,ArrayN[0 ],Array1[1],Array2[1],..,ArrayN[1]... :

    function array_zip_merge() {
      $output = array();
      // The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
      for ($args = func_get_args(); count($args); $args = array_filter($args)) {
        // &$arg allows array_shift() to change the original.
        foreach ($args as &$arg) {
          $output[] = array_shift($arg);
        }
      }
      return $output;
    }

// test

$a = range(1, 10);
$b = range('a', 'f');
$c = range('A', 'B');
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910

虽然我了解此示例中的每个内置函数各自执行的操作,但我无法理解它们如何在此函数中协同工作,尽管包括解释性注释...

有人可以帮我分解一下吗?该功能按原样运行得很好,但我不明白它是如何工作的,这让我发疯...

P.S: 这个函数取自Interleaving multiple arrays into a single array问题。

最佳答案

数组$a$b$c分别有10个、6个和2个元素。

$a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$b = ['a', 'b', 'c', 'd', 'e', 'f'];
$c = ['A', 'B'];

当您将数组作为参数提供给 array_zip_merge() 函数时,请查看 for 循环。 func_get_args() 将使用提供的所有参数设置 $args。在第一个 for 循环运行开始时,

$args = [$a, $b, $c];
count($args) = 3;

foreach 循环中,array_shift 将返回每个数组的第一个元素,导致 $output 类似于

$output = [1, 'a', 'A'];

数组现在看起来像,

$a = [2, 3, 4, 5, 6, 7, 8, 9, 10];
$b = ['b', 'c', 'd', 'e', 'f'];
$c = ['B'];

在第一个 for 循环结束时,array_filter 函数将测试是否有任何数组为空并将其从 $args 中移除。同样的事情会在第二次运行时发生,到第二个 for 循环结束时,变量看起来像

$a = [3, 4, 5, 6, 7, 8, 9, 10];
$b = ['c', 'd', 'e', 'f'];
$c = [];
$output = $output = [1, 'a', 'A', 2, 'b', 'B'];
//because $c is empty array_filter() removes it from $args
$args = [$a, $b];

因此,在 for 循环的第三次迭代中,count($args) 将返回 2。当 $b 的最后一个元素被 array_shift 移除时,count($args) 将返回 1。迭代将继续,直到所有数组都为空

关于php - 解释这个数组转置和展平函数是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34482028/

相关文章:

php - 用户输入值 sql 的日期之间

C++ 函数指针

hadoop - Mahout 转置矩阵

list - 仅使用 `!!` 和 `length` 实现矩阵的转置

具有查询优化功能的 php 函数

hadoop - HIVE 数据透视和求和

php - 在 PHP 中重定向的正确方法是什么

php - (laravel 4) 更新配置文件信息//显示空值或已存储在表中的值?

带有两个时间戳的 PHP If 语句

c - 为什么函数不会改变变量?