有没有像python的zip的PHP函数?

Python有一个很好的zip()函数。 有相当于PHP的吗?

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

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

如果某些数组较短,那么它们将被填充到最长的长度,不像python,返回的结果是最短数组的长度。

试试这个函数来创build一个类似于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; } 

您可以根据需要以尽可能多的项目传递此函数。

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

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

它以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')) 

检查这个演示 ,以certificate上述。

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

zip()非常接近的解决scheme,同时使用内置的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)调用?

正如我在我的评论中已经提到的 ,我倾向于赞成nabnabit的解决scheme( array_map(null, $a, $b, ...) ),但是以稍微修改的方式(如上所示)。

一般来说这个:

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

是Python的对手:

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

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

我为PHP的PHP实现编写了一个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>'; 
 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; } 
 // 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>'; 

你可以看到array_map方法:

 $arr1 = ['get', 'method']; $arr2 = ['post']; $ret = array_map(null, $arr1, $arr2); 

输出:

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

php function.array-map

您可以在非标准PHP库中findzip以及其他Python函数。 包括运算符模块和defaultarray 。

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

为了解决将单个数组传递给map_array ,可以传递这个函数…不幸的是,你不能传递"array"因为它不是一个真正的函数,而是一个内置的东西。

 function make_array() { return func_get_args(); } 

专门给那些觉得应该与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)); }