PHP - 数组映射或过滤
PHP - Array mapping or filtering
抱歉标题含糊不清,我无法用一句话概括这个问题(我愿意接受建议或修改)。
我有一个二维关联数组,每个键都有一个包含 2 个数字的数组。
像这样:
Array
(
[one] => Array
(
[0] => 1
[1] => 2
)
[two] => Array
(
[0] => 1
[1] => 2
)
[three] => Array
(
[0] => 1
[1] => 2
)
)
我想知道是否有一种方法可以使用 array_map() 或 array_filter() 来 return 一个数组,该数组具有每个键和每个键中的第一个数字值数组,如下所示:
Array
(
[one] => 1
[two] => 1
[three] => 1
)
我不希望使用循环或类似的东西创建一个新数组,我想将动态转换作为函数的参数,如果你明白我的意思的话。
我可以编写自己的函数来实现此目的,但我想知道是否可以使用 array_map() 或 array_filter() 来完成。
我尝试使用 array_merge()、array_keys() 和 array_values() 的各种组合,但没有成功。
预先感谢您提供的任何帮助。
第一个solution是:
$keys = array_keys($ar); // get all keys
$vals = array_column($ar,0); // get all values with 0 index
$res = array_combine($keys,$vals); // combine them
顺便说一句,你不需要使用一些额外的函数,简单的 foreach
循环就是 enough:
$res = [];
foreach($arr as $key=>$val){
$res[$key] = $val[0];
}
您可以看到 array_walk
和 foreach
函数 here 的性能差异。
我认为在这种情况下使用循环会更好。然而,这个应该适用于你的情况。
<?php
$arr = array(
"one" => array(1, 2),
"two" => array(1, 2),
"three" => array(1, 2)
);
$res = array();
array_walk($arr, function ($v, $k) use (&$res) {
$res[$k] = $v[0];
});
print_r($res);
使用 array_map 你可以做类似的事情 :
$array_2= array_map(function ($sub_array) {
$new_value = $sub_array[0];
return $new_value;
},$array_1);
您可以使用array_reduce
迭代减少数组。
return array_reduce(array_keys($attribs), function($carry, $key) use ($attribs){
$carry[$key]= $attribs[$key][0];
return $carry;
});
希望对您有所帮助,
是的,它可以只使用一个函数 array_map
和回调来完成:
- map 将遍历
$arr
中的数组
- 回调只取数组的第一个元素。
<?php
$arr = array(
"one" => [1, 2],
"two" => [1, 2],
"three" => [1, 2]
);
$res = array_map(fn($sub_arr)=>$sub_arr[0],$arr);
echo "<pre>";
print_r($res);
/*
Array
(
[one] => 1
[two] => 1
[three] => 1
)
*/
抱歉标题含糊不清,我无法用一句话概括这个问题(我愿意接受建议或修改)。
我有一个二维关联数组,每个键都有一个包含 2 个数字的数组。
像这样:
Array
(
[one] => Array
(
[0] => 1
[1] => 2
)
[two] => Array
(
[0] => 1
[1] => 2
)
[three] => Array
(
[0] => 1
[1] => 2
)
)
我想知道是否有一种方法可以使用 array_map() 或 array_filter() 来 return 一个数组,该数组具有每个键和每个键中的第一个数字值数组,如下所示:
Array
(
[one] => 1
[two] => 1
[three] => 1
)
我不希望使用循环或类似的东西创建一个新数组,我想将动态转换作为函数的参数,如果你明白我的意思的话。
我可以编写自己的函数来实现此目的,但我想知道是否可以使用 array_map() 或 array_filter() 来完成。
我尝试使用 array_merge()、array_keys() 和 array_values() 的各种组合,但没有成功。
预先感谢您提供的任何帮助。
第一个solution是:
$keys = array_keys($ar); // get all keys
$vals = array_column($ar,0); // get all values with 0 index
$res = array_combine($keys,$vals); // combine them
顺便说一句,你不需要使用一些额外的函数,简单的 foreach
循环就是 enough:
$res = [];
foreach($arr as $key=>$val){
$res[$key] = $val[0];
}
您可以看到 array_walk
和 foreach
函数 here 的性能差异。
我认为在这种情况下使用循环会更好。然而,这个应该适用于你的情况。
<?php
$arr = array(
"one" => array(1, 2),
"two" => array(1, 2),
"three" => array(1, 2)
);
$res = array();
array_walk($arr, function ($v, $k) use (&$res) {
$res[$k] = $v[0];
});
print_r($res);
使用 array_map 你可以做类似的事情 :
$array_2= array_map(function ($sub_array) {
$new_value = $sub_array[0];
return $new_value;
},$array_1);
您可以使用array_reduce
迭代减少数组。
return array_reduce(array_keys($attribs), function($carry, $key) use ($attribs){
$carry[$key]= $attribs[$key][0];
return $carry;
});
希望对您有所帮助,
是的,它可以只使用一个函数 array_map
和回调来完成:
- map 将遍历
$arr
中的数组
- 回调只取数组的第一个元素。
<?php
$arr = array(
"one" => [1, 2],
"two" => [1, 2],
"three" => [1, 2]
);
$res = array_map(fn($sub_arr)=>$sub_arr[0],$arr);
echo "<pre>";
print_r($res);
/*
Array
(
[one] => 1
[two] => 1
[three] => 1
)
*/