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_walkforeach 函数 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 和回调来完成:

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