PHP - 数组映射或过滤

4

抱歉标题不够清晰,我很难用一句话来总结这个问题(如果有建议或修改,欢迎提出)。

我有一个二维关联数组,每个键对应一个包含 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()的各种组合,但均未成功。非常感谢您提供的任何帮助。

你使用哪种编程语言? - Aksen P
哦,哇,我完全忘记告诉你们我正在使用PHP。对此感到抱歉! - vulpinus
我已经更新了我的回答。你应该知道array_walk函数的性能比foreach函数要低。 - Aksen P
5个回答

3
我认为在这种情况下使用循环会更好。但是这个代码应该适用于你的情况。
<?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);

2

是的,可以只使用一个带有回调函数的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
)
*/

2
第一个解决方案是:
$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循环就足够了。
$res = [];
foreach($arr as $key=>$val){
    $res[$key] = $val[0];
}

你可以在这里看到array_walkforeach函数的执行效果差异。

谢谢,我之前不知道array_column(),以后一定会用它。虽然这不是我想要的完全相同的东西...我正在尝试看看是否可能只使用一个函数调用而不是三个。 - vulpinus
@vulpinus,是的,这是可能的。这就是为什么我写了“第一个解决方案”的原因。 - Aksen P

2
使用array_map,您可以像这样做:
$array_2= array_map(function ($sub_array) {
 $new_value  =   $sub_array[0];
 return $new_value;
},$array_1);

1
请解释一下$array_2$array_1$sub_array分别是什么。 - Aksen P
1
$array_1 是输入数据,$array_2 是我们想要的输出数据。而 $sub_array 实际上是第一个数组中的子数组。看一下我的答案,我使用了相同的方法,但加入了回调函数和更多细节。希望能有所帮助! - XMehdi01

2
你可以使用array_reduce来迭代地减少数组。
return array_reduce(array_keys($attribs), function($carry, $key) use ($attribs){
        $carry[$key]= $attribs[$key][0];
        return $carry;
    });

希望这能帮到您,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接