在PHP中用Python的zip

总结

有很多可能的解答,但

    pythonのzip – Qiita

$a = [1, 2, 3];
$b = [4, 5, 6];
$z = array_map(NULL, $a, $b);
print_r($z);

将数组 $a 设为 [1, 2, 3];
将数组 $b 设为 [4, 5, 6];
利用 array_map 函数,将数组 $a 和 $b 同时传递给 NULL 函数,并将返回的结果赋值给变量 $z;
使用 print_r 函数来打印变量 $z。

够了。

Python的zip函数是什么意思?

2. Python 2.7.x 文档中的内置函数:#zip

以下是对原文的中文本地化阐述:

>> x = [1, 2, 3]
>> y = [4, 5, 6]
>> 以zip函数将x与y进行合并
>> 合并后的结果为[(1, 4), (2, 5), (3, 6)]。

如果用我自己的话来说,总觉得是这样的。

返回一个将每个array的第n个值汇总到一个新array中的array。

array_map(NULL, $a, $b)是什么意思?

PHP:array_map – 手册

array_map() 函数会将回调函数应用于 array1 的每个元素,并返回包含所有元素的数组。回调函数所接受的参数数量必须与传递给 array_map() 函数的数组数量相匹配。


这个函数有一个有趣的用法,那就是构建一个数组的数组。通过使用回调函数的名称为NULL,可以轻松实现这一点。

使用回调函数接收每个数组的值并处理结果,然后返回一个新的数组,但如果只接收到null,则不做任何处理并返回原数组。

也许

function($a, $b){
    return array($a, $b);
}

和…是同义的。(适用于可变参数版本,实际上是…或者func_get_args)

与array_map(NULL, $a, $b)类似

2. 内置函数 — Python 2.7.x 文档 #zip

当所有参数的长度都相同时,zip()函数类似于初值参数为None的map()函数。

返回的列表将被截断为参数序列中长度最小的序列的长度。

PHP: array_map – 手册

PHP: array_map – 手册

通常情况下,如果使用两个或以上的数组,则它们的长度必须相等。这是因为回调函数会同时应用于相应的元素。如果数组的长度不相等,则长度较短的数组将通过填充空元素来扩展,以与长度最长的数组相匹配。

如果长度不同


a = [1, 2, 3]
b = [4, 5]

print zip(a, b)

# [(1, 4), (2, 5)]
$a = [1, 2, 3];
$b = [4, 5];

var_dump(array_map(null, $a, $b));

/*
array(3) {
  [0]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(4)
  }
  [1]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    int(5)
  }
  [2]=>
  array(2) {
    [0]=>
    int(3)
    [1]=>
    NULL
  }
}
*/

如果 zip 的长度不足,它会被忽略;如果 map 是 PHP,它会用 null 补充不足的部分。

使它更像zip

请用中文原生方式重新表述以下内容,只需给出一个选项:

试案1

请改用中文母语重新表达以下内容,仅需给出一个选择:

案例1

排除具有扩展的空值的数组

$a = [1, 2, 3];
$b = [4, 5];


$map = array_map(null, $a, $b );

print_r((array_filter($map,function($array){
        return !in_array(null, $array);
})));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
        )

)
*/

然而,由于PHP数组可以包含null值,所以无法通过这种方式判断是否已扩展。

$a = [1, null, 3];
$b = [4, 5];


$map = array_map(null, $a, $b );

print_r((array_filter($map,function($array){
        return !in_array(null, $array);
})));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
        )
)
*/

无法检测到在array_map中的扩展。
应该根本就不要使用扩展的array_map。

直接地

$a = [1, null, 3, 4];
$b = [5, 6,    7];

function zip(){

        $args = func_get_args();
        // 添字は捨てるので扱いやすように数値に変換
        array_walk($args, function(&$arg) {
                $arg = array_values($arg);
        });
        $r =[];
        do {
                $tmp = [];
                foreach($args as &$arg) {
                        if(!array_key_exists(0, $arg)) {
                                return $r;
                        }
                        $tmp[] = array_shift($arg);
                }
                $r[] = $tmp;
        } while(true);
}

print_r(zip($a, $b));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 5
        )

    [1] => Array
        (
            [0] =>
            [1] => 6
        )

    [2] => Array
        (
            [0] => 3
            [1] => 7
        )

)
*/

添字的重新分配是按照输入顺序进行的,因此无论数字和字符串的混合如何,它们都会从0开始依次分配。

我认为通过使用array_shift()可以删除$i,但是由于foreach是按引用传递的,所以每次使用array_shift()都会重新索引。
如果要使用$i,则应该使用while(++$i)、array_key_exists($i, $arg)、$tmp[] = $arg[$i]。
如果根本不使用$i,则可以使用while而不是do while。

使用array_column函数

如果使用PHP5.5以上的版本,现在可以使用可变长参数,不过如果使用5.6以上的版本的话。

$a = [1, null, 3, 4];
$b = [5, 6,    7];

function zip(){

    $args = func_get_args();

    array_walk($args, function($arg) {
        $arg = array_values($arg);
    });

    $min = array_reduce($args, function($min, $array){
        return min($min, count($array));
    }, PHP_INT_MAX);
    $r = [];
    $i = -1;
    while(++$i < $min) {
        $r[] = array_column($args, $i);
    }
    return $r;
}

print_r(zip($a, $b));

/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 5
        )

    [1] => Array
        (
            [0] =>
            [1] => 6
        )

    [2] => Array
        (
            [0] => 3
            [1] => 7
        )

)
*/

请提供具体的参考文章。

在Python、Zip和PHP等中进行搜索

    • pythonのzip – Qiita

 

    • php 配列の縦横変換 – Qiita

 

    array_map(null, …) で配列を結合 – Qiita

寫完後才發現

Is there a php function like python’s zip? – Stack Overflow
Rubyのzipは拡張する?というか拡張かつ切り捨てのような動作。
zip (Array) – Rubyリファレンス
こちらもチャンレンジしてみたい。
よりpythonに合わせる方法もいろいろと。
minの取り方がよりスマートなのがありますね。
array_sliceがNice。

因为我们在使用长度基本相同的数组进行测试,所以不需要太过考虑不同长度的对应关系。我认为减少元素可能会更加不方便。

广告
将在 10 秒后关闭
bannerAds