Python有一个很好的zip()
函数。是否有PHP等价物?
答案 0 :(得分:81)
只要所有数组的长度相同,您就可以使用array_map
和null
作为第一个参数。
array_map(null, $a, $b, $c, ...);
如果某些数组较短,它们将使用空值填充最长的长度,这与python不同,其中返回的结果是最短数组的长度。
答案 1 :(得分:16)
否则就像自己编码一样:
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 module和defaultarray。
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]]