【问题标题】:Array mapping in PHP with keysPHP中带键的数组映射
【发布时间】:2012-08-16 13:32:37
【问题描述】:

出于好奇(我知道它可以是单行 foreach 语句),是否有一些 PHP 数组函数(或许多函数的组合)给出了如下数组:

Array (
    [0] => stdClass Object (
        [id] => 12
        [name] => Lorem
        [email] => lorem@example.org
    )
    [1] => stdClass Object (
        [id] => 34
        [name] => Ipsum
        [email] => ipsum@example.org
    )
)

并且,给定'id''name',会产生类似:

Array (
    [12] => Lorem
    [34] => Ipsum
)

我经常使用这种模式,我注意到array_map 在这种情况下非常无用,因为您无法为返回的数组指定键。

【问题讨论】:

  • 可能不会,但你可以编写自己的函数:)
  • array_map 可以采用自定义函数,您可以使用它来指定数组键。
  • @Ariel 怎么样?我找不到为array_map returned 数组指定键的方法。
  • @lorenzo-s 在回调中,用你需要的键输出数组。
  • 这可以解决问题: return array_reduce($options, function(&$r, $x){ $r[$x->property] = $x->property2; return $r;} );

标签: php arrays map


【解决方案1】:

最简单的方法是使用array_column()

$result_arr = array_column($arr, 'name', 'id');
print_r($result_arr );

【讨论】:

    【解决方案2】:

    最简单的方法是使用 LINQ 端口,例如 YaLinqo library*。它允许对数组和对象执行类似 SQL 的查询。它的toDictionary 函数接受两个回调:一个返回结果数组的键,一个返回值。例如:

    $userNamesByIds = from($users)->toDictionary(
        function ($u) { return $u->id; },
        function ($u) { return $u->name; }
    );
    

    或者你可以使用更短的语法使用字符串,相当于上面的版本:

    $userNamesByIds = from($users)->toDictionary('$v->id', '$v->name');
    

    如果省略第二个参数,则对象本身将用作结果数组中的值。

    *我开发的

    【讨论】:

      【解决方案3】:

      只需使用array_reduce:

      $obj1 = new stdClass;
      $obj1 -> id = 12;
      $obj1 -> name = 'Lorem';
      $obj1 -> email = 'lorem@example.org';
      
      $obj2 = new stdClass;
      $obj2 -> id = 34;
      $obj2 -> name = 'Ipsum';
      $obj2 -> email = 'ipsum@example.org';
      
      $reduced = array_reduce(
          // input array
          array($obj1, $obj2),
          // fold function
          function(&$result, $item){ 
              // at each step, push name into $item->id position
              $result[$item->id] = $item->name;
              return $result;
          },
          // initial fold container [optional]
          array()
      );
      

      这是一个由 cmets 组成的单行 ^^

      【讨论】:

        【解决方案4】:

        因为你的数组是对象数组,所以你可以调用(它就像一个类的变量)尝试用这个来调用:

         foreach ($arrays as $object) {
            Echo $object->id;
            Echo "<br>";
            Echo $object->name;
            Echo "<br>";
            Echo $object->email;
            Echo "<br>";
         } 
        

        那你就可以了

         // your array of object example $arrays;
         $result = array();
         foreach ($arrays as $array) {
               $result[$array->id] = $array->name;
         }
        
           echo "<pre>";
           print_r($result);
           echo "</pre>";
        

        抱歉,我正在用手机接听电话。无法编辑代码

        【讨论】:

          【解决方案5】:

          我发现我可以做到:

          array_combine(array_map(function($o) { return $o->id; }, $objs), array_map(function($o) { return $o->name; }, $objs));
          

          但这很丑陋,需要在同一个数组上进行两个完整的循环。

          【讨论】:

          • 您可能应该手动执行此操作(即 foreach 循环) - 它可能会比这更快。
          猜你喜欢
          • 2018-08-07
          • 2019-04-11
          • 1970-01-01
          • 2018-02-24
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          • 2011-07-03
          • 1970-01-01
          相关资源
          最近更新 更多