解释这个自定义函数如何工作PHP

时间:2015-12-27 15:47:25

标签: php function 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问题。

2 个答案:

答案 0 :(得分:2)

数组$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。迭代将继续,直到所有数组都为空

答案 1 :(得分:0)

array_zip_merge 内, for 语句始终采用每个数组的第一个值,并将它们分别添加到输出变量。

因为 array_shift 删除了它返回的元素,所以在每个循环中第一个元素都不同。当它因为它而变空时,循环无关,并且会中断。

如果您仍然不明白,请询问您遇到问题的代码的具体部分。