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

时间:2010-05-11 23:31:47

标签: php python

Python有一个很好的zip()函数。是否有PHP等价物?

14 个答案:

答案 0 :(得分:81)

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

array_map(null, $a, $b, $c, ...);

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

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}

您可以根据需要将此函数传递给任意数量的数组。

答案 3 :(得分:7)

与Python的zip()函数完全相同,并且与PHP&lt;&lt; 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);
};

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

以下内容:

zip(array(1,2,3,4,5),array('a','b'));

给出以下结果:

array(array(1,'a'), array(2,'b'))

以及以下内容:

zip(array(1,2,3,4,5),array('a','b'),array('x','y','z'));

给出以下结果:

array(array(1,'a','x'), array(2,'b','y'))

检查this demonstration以获取上述证明。

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

答案 4 :(得分:4)

解决方案

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
);

为什么不简单array_map(null, $a, $b, $c)来电话?

正如我already mentioned in my comment,我倾向于赞成nabnabit的解决方案(array_map(null, $a, $b, ...)),但是稍作修改(如上所示)。

一般来说:

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

是Python的对应物:

itertools.izip_longest(a, b, c, fillvalue=None)

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

答案 5 :(得分:1)

我为PHP implementation of enum写了zip()个函数  代码已经过修改,以允许Python风格的zip()以及Ruby风格。差异在评论中解释:

/*
 * This is a Python/Ruby style zip()
 *
 * zip(array $a1, array $a2, ... array $an, [bool $python=true])
 *
 * The last argument is an optional bool that determines the how the function
 * handles when the array arguments are different in length
 *
 * By default, it does it the Python way, that is, the returned array will
 * be truncated to the length of the shortest argument
 *
 * If set to FALSE, it does it the Ruby way, and NULL values are used to
 * fill the undefined entries
 *
 */
function zip() {
    $args = func_get_args();

    $ruby = array_pop($args);
    if (is_array($ruby))
        $args[] = $ruby;

    $counts = array_map('count', $args);
    $count = ($ruby) ? min($counts) : max($counts);
    $zipped = array();

    for ($i = 0; $i < $count; $i++) {
        for ($j = 0; $j < count($args); $j++) {
            $val = (isset($args[$j][$i])) ? $args[$j][$i] : null;
            $zipped[$i][$j] = $val;
        }
    }
    return $zipped;
}

示例:

$pythonzip = zip(array(1,2,3), array(4,5),  array(6,7,8));
$rubyzip   = zip(array(1,2,3), array(4,5),  array(6,7,8), false);

echo '<pre>';
print_r($pythonzip);
print_r($rubyzip);
echo '<pre>';

答案 6 :(得分:0)

public static function array_zip() {
    $result = array();
    $args = array_map('array_values',func_get_args());
    $min = min(array_map('count',$args));
    for($i=0; $i<$min; ++$i) {
        $result[$i] = array();
        foreach($args as $j=>$arr) {
            $result[$i][$j] = $arr[$i];
        }
    }
    return $result;
}

答案 7 :(得分:0)

// create
$a = array("a", "c", "e", "g", "h", "i");
$b = array("b", "d", "f");
$zip_array = array();

// get length of the longest array
$count = count(max($a, $b));

// zip arrays
for($n=0;$n<$count;$n++){
    if (array_key_exists($n,$a)){
        $zip_array[] = $a[$n];
        }   
    if (array_key_exists($n,$b)){
        $zip_array[] = $b[$n];
        }   
    }

// test result
echo '<pre>'; print_r($zip_array); echo '<pre>';

答案 8 :(得分:0)

您可以在zip中找到Non-standard PHP library以及其他Python函数。包括operator moduledefaultarray

use function nspl\a\zip;
$pairs = zip([1, 2, 3], ['a', 'b', 'c']);

答案 9 :(得分:0)

[0, 4]

答案 10 :(得分:0)

这就像在 Python 中一样

function zip(...$arrays) {
  return array_filter(
      array_map(null, ...(count($arrays) > 1 ? $arrays : array_merge($arrays, [[]]))),
      fn($z) => count($z) === count(array_filter($z)) || count($arrays) === 1
  );
}

答案 11 :(得分:-1)

要克服将单个数组传递给map_array的问题,您可以传递此函数...遗憾的是,您无法传递"array",因为它不是真正的函数,而是内置的东西。< / p>

function make_array() { return func_get_args(); }

答案 12 :(得分:-1)

致力于那些与array_combine相关的人:

function array_zip($a, $b) 
{
    $b = array_combine(
        $a, 
        $b  
        );  

    $a = array_combine(
        $a, 
        $a  
        );  

    return array_values(array_merge_recursive($a,$b));
}

答案 13 :(得分:-1)

您可以看到array_map方法:

$arr1 = ['get', 'method'];
$arr2 = ['post'];

$ret = array_map(null, $arr1, $arr2);

输出:

[['get', 'method'], ['post', null]]

php function.array-map