解释这个自定义函数是如何在PHP中工作的

解释这个自定义函数是如何在PHP中工作的,php,function,array-filter,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

在这里,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
虽然我了解本例中的每个内置函数各自的功能,但我无法完全理解这些函数是如何在这个函数中协同工作的,尽管其中包括解释注释

有人能帮我把它分解一下吗?该功能工作得很好,只是让我疯狂,我不明白它是如何工作的


注意:这个函数是从问题中提取出来的。

数组\u zip\u merge中,for语句总是取每个数组的第一个值,并将它们分别添加到输出变量中

因为array\u shift删除它返回的元素,所以在每个循环中,第一个元素都是不同的。当它因此变空时,循环将无所事事并中断


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

数组
$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\u zip\u merge()函数的参数输入时,请查看
for
循环。
func\u get\u args()
将使用提供的所有参数设置
$args
。开始第一次循环运行时

$args = [$a, $b, $c];
count($args) = 3;
foreach
循环中,
array\u 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\u 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
。当
array\u shift
删除
$b
的最后一个元素时,
计数($args)
将返回
1
。迭代将继续,直到所有数组都为空

您自己编写一个类似的函数,它将告诉您需要什么。很可能你最终会自己重写上面的代码。也就是说,在不同的执行点检查上述代码中变量的内容,以了解其作用。感谢您如此详细的回答,您一步一步的迭代在我脑海中澄清了问题,最后一切都开始变得有意义:))