有像python的zip这样的php函数吗?

Cra*_*aig 59 php python

Python有一个很好的zip()功能.是否有PHP等价物?

hab*_*bit 87

只要所有数组的长度相同,您就可以使用array_mapwith null作为第一个参数.

array_map(null, $a, $b, $c, ...);
Run Code Online (Sandbox Code Playgroud)

如果某些数组较短,则它们将使用空值填充最长的长度,这与python不同,其中返回的结果是最短数组的长度.

  • @Gumbo虽然这是Ruby方式,而不是Python方式,但我会说它足够接近大多数用途.将不同长度的数组传递到zip通常不是你故意做的事情.我在答案中添加了对此的解释. (6认同)
  • 关于这种方法的另一个问题是,如果你在单个数组上使用它而不是多个数组,它会表现得相当奇怪.如果你运行`array_map(null,array(1,2,3))`你没有得到,如你所料,`array(array(1),array(2),array(3))`,但是而只是得到一个原始值的数组,`array(1,2,3)`.这可能不会影响大多数人,但是如果你试图将任意数量的数组压缩在一起(例如,如果数组的数量由对数据库的查询定义),那么它可能会成为一个令人抓狂的问题.追查.不过,如果使用得恰到好处,那就很好 (5认同)
  • 你真的尝试过吗?`array_map` 的行为不像 Python 的 `zip`。`array_map(null, array(1,2), array(3))` 返回 `array(array(1,3), array(2,null))` 而 `zip([1,2], [3]) )` 只返回 `[(1,2)]`。 (2认同)

Jak*_*mpl 16

array_combine 来得很近.

否则就像自己编码一样:

function array_zip($a1, $a2) {
  for($i = 0; $i < min(length($a1), length($a2)); $i++) {
    $out[$i] = [$a1[$i], $a2[$i]];
  }
  return $out;
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是“计数”而不是“长度”,对吗? (2认同)

Gum*_*mbo 13

尝试使用此函数创建一个类似于Python的数组数组zip:

function zip() {
    $args = func_get_args();
    $zipped = array();
    $n = count($args);
    for ($i=0; $i<$n; ++$i) {
        reset($args[$i]);
    }
    while ($n) {
        $tmp = array();
        for ($i=0; $i<$n; ++$i) {
            if (key($args[$i]) === null) {
                break 2;
            }
            $tmp[] = current($args[$i]);
            next($args[$i]);
        }
        $zipped[] = $tmp;
    }
    return $zipped;
}
Run Code Online (Sandbox Code Playgroud)

您可以根据需要将此函数传递给任意数量的项目.


Tad*_*eck 8

与Python的zip()功能完全一样,并且与PHP <5.3兼容:

function zip() {
    $params = func_get_args();
    if (count($params) === 1){ // this case could be probably cleaner
        // single iterable passed
        $result = array();
        foreach ($params[0] as $item){
            $result[] = array($item);
        };
        return $result;
    };
    $result = call_user_func_array('array_map',array_merge(array(null),$params));
    $length = min(array_map('count', $params));
    return array_slice($result, 0, $length);
};
Run Code Online (Sandbox Code Playgroud)

它以Python的方式合并数组,zip()并且不会返回到达最短数组末尾后找到的元素.

下列:

zip(array(1,2,3,4,5),array('a','b'));
Run Code Online (Sandbox Code Playgroud)

给出以下结果:

array(array(1,'a'), array(2,'b'))
Run Code Online (Sandbox Code Playgroud)

以下内容:

zip(array(1,2,3,4,5),array('a','b'),array('x','y','z'));
Run Code Online (Sandbox Code Playgroud)

给出以下结果:

array(array(1,'a','x'), array(2,'b','y'))
Run Code Online (Sandbox Code Playgroud)

请查看此演示以获取上述证明.

编辑:添加了对接收单个参数的支持(array_map在这种情况下表现不同;感谢Josiah).


Tad*_*eck 5

解决方案

zip()非常匹配并同时使用内置 PHP 函数的解决方案是:

array_slice(
    array_map(null, $a, $b, $c), // zips values
    0, // begins selection before first element
    min(array_map('count', array($a, $b, $c))) // ends after shortest ends
);
Run Code Online (Sandbox Code Playgroud)

为什么不简单array_map(null, $a, $b, $c)调用?

正如我在评论中已经提到的,我倾向于支持 nabnabit 的解决方案 ( array_map(null, $a, $b, ...)),但方式略有修改(如上所示)。

一般来说是这样的:

array_map(null, $a, $b, $c);
Run Code Online (Sandbox Code Playgroud)

是 Python 的对应物:

itertools.izip_longest(a, b, c, fillvalue=None)
Run Code Online (Sandbox Code Playgroud)

list()如果您想要列表而不是迭代器,请将其包装起来)。因此,它并不完全符合模拟zip()行为的要求(除非所有数组都具有相同的长度)。