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