【问题标题】:PHP - Array mapping or filteringPHP - 数组映射或过滤
【发布时间】:2020-03-17 15:15:24
【问题描述】:

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

我有一个二维关联数组,每个键都有一个由 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() 的各种组合,但没有成功。

提前感谢您提供的任何帮助。

【问题讨论】:

  • 您使用哪种编程语言?
  • 哦,哇,我完全忘了说我正在使用 PHP。很抱歉!
  • 我已经更新了我的答案。您应该知道array_walk 的性能低于foreach 函数。

标签: php arrays array-filter array-map


【解决方案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 的性能差异。

【讨论】:

  • 谢谢,不知道array_column(),以后肯定会用到。虽然这不是我想要的。我想看看是否有可能只用 1 个函数调用而不是 3 个。
  • @vulpinus,是的,这是可能的。这就是我写第一个解决方案的原因。
【解决方案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);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 解释什么是$array_2$array_1$sub_array
    • $array_1 是输入数据,$array_2 是我们想要的输出数据。和$sub_array 实际上它们是第一个数组中的子数组。看看我的答案,我使用相同的方法,但带有回调函数和更多细节。希望对您有所帮助!
    【解决方案4】:

    您可以使用array_reduce 迭代减少数组。

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

    希望对您有所帮助,

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2020-11-23
        • 1970-01-01
        • 2021-08-26
        • 2016-03-27
        • 2022-01-14
        • 2017-11-13
        • 2021-08-04
        • 1970-01-01
        相关资源
        最近更新 更多