PHP-数组映射或过滤

时间:2019-11-21 16:09:08

标签: php arrays array-filter array-map

抱歉,标题含糊,我很难用一个句子来概括这个问题(我愿意接受建议或修改)。

我有一个二维关联数组,每个键由2个数字组成。

赞:

Array
   (
   [one] => Array
      (
      [0] => 1
      [1] => 2
   )
   [two] => Array
      (
      [0] => 1
      [1] => 2
   )
   [three] => Array
      (
      [0] => 1
      [1] => 2
   )
)

我想知道是否有一种方法可以使用array_map()或array_filter()返回一个数组,该数组具有每个键和每个值数组中的第一个数字,如下所示:

Array
   (
   [one] => 1
   [two] => 1
   [three] => 1
)

我不希望通过使用循环或类似方法来创建新数组,如果您知道我的意思,我想即时进行转换作为函数的参数。

我可以编写自己的函数来实现此目的,但我想知道是否可以使用array_map()或array_filter()完成此功能。

我尝试使用array_merge(),array_keys()和array_values()的各种组合都没有成功。

在此先感谢您提供的任何帮助。

5 个答案:

答案 0 :(得分:2)

我认为在这种情况下最好使用循环。但是,这应该适合您的情况。

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

答案 1 :(得分:1)

第一个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_walkforeach函数here的性能差异。

答案 2 :(得分:1)

是的,它可以只使用一个带有回调的函数 array_map 来完成:

  1. map 将遍历 $arr 内的数组
  2. 回调只根据需要获取数组的第一个元素。
<?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
)
*/

答案 3 :(得分:0)

使用array_map,您可以做类似的事情:

$array_2= array_map(function ($sub_array) {
 $new_value  =   $sub_array[0];
 return $new_value;
},$array_1);

答案 4 :(得分:0)

您可以使用array_reduce来迭代地缩小数组。

return array_reduce(array_keys($attribs), function($carry, $key) use ($attribs){
        $carry[$key]= $attribs[$key][0];
        return $carry;
    });

希望获得帮助,