【问题标题】:PHP array mappingPHP数组映射
【发布时间】:2011-07-03 18:11:42
【问题描述】:

有没有比foreach 更简洁的方法来获取所有“标签”值的数组?

$methods[0]['label'] = 'test';
$methods[0]['nr']    = 99;
$methods[1]['label'] = 'whatever';
$methods[1]['nr']    = 10;


foreach($methods as $method) {
    $methodsLabel[] = $method['label'];
}

【问题讨论】:

  • 我不认为 foreach 是不干净的。你认为它不干净是因为你更喜欢函数式编程吗?
  • 我也认为你的代码就这样很好。它不仅速度快,而且非常易于阅读和维护……每个人都知道如何查看 foreach!
  • @PetarZivkovic 谢谢你的意见!

标签: php arrays multidimensional-array mapping


【解决方案1】:

Arrow functions 已被引入 PHP 7.4,这使得它更加简洁。

$methodsLabel = array_map(fn($x) => $x['label'], $methods)

【讨论】:

    【解决方案2】:

    从 PHP 5.5+ 开始,这正是 array_column() 所做的:

    $methodsLabel = array_column($methods, 'label');
    

    http://php.net/manual/function.array-column.php


    3v4l 示例:https://3v4l.org/ZabAb

    【讨论】:

    • 这是一个有趣的发现,因为我的 Sublime Text 不知道该功能,因此不提供自动完成功能。
    【解决方案3】:

    如果标签是数组中的第一个元素,那么带有array_map 的“当前”将正常工作。

    array_map('current', $methods); 
    

    【讨论】:

      【解决方案4】:

      不,没有比您实现的代码更快的方法了。由于函数调用的开销,所有其他方法都会变慢。对于一个小数组,差异将是微不足道的,但对于一个大数组(大约 100 个成员,取决于实现),差异可能是巨大的......

      您可以array_map 它,但我会坚持使用您在上面发布的原始 PHP...它更易于维护且恕我直言更具可读性...

      毕竟,告诉我哪个一目了然更能告诉你它的作用:

      $results = array();
      foreach ($array as $value) {
          $results[] = $value['title'];
      }
      

      对比

      $results = array_map(function($element) {
              return $element['title'];
          },
          $array
      );
      

      或者:

      $callback = function($element) {
          return $element['title'];
      }
      $results = array_map($callback, $array);
      

      就个人而言,第一个对我来说是最好的。在不知道任何它在做什么的情况下立即显而易见。其他人需要了解array_map 语义才能理解。再加上array_map 更慢的事实,这对foreach 来说是双赢。

      代码应该尽可能优雅。它应该是可读的...

      【讨论】:

      • 我改变了我的描述,我不是在寻找一个快速的解决方案我在寻找一个更清洁的解决方案。
      • @powtac:我仍然支持一个更易读、更容易理解的直接 foreach。你说的是同样的,如果不是更少的代码与foreach,所以我看不到好处......
      【解决方案5】:
      array_map('array_shift', $methods);
      

      这里假设 label 将是每个数组的第一个元素。

      【讨论】:

      • @Gaurav @ircmaxell 好的,这真的很好。 +1
      • 对此要非常小心。如果假设因任何原因中断(label 因任何原因排序不同),代码将返回不正确的结果。
      • @ircmaxell :是的,这里需要小心。
      【解决方案6】:

      在 PHP 5.3+ 上,您可以使用与 array_map 配对的匿名函数。

      $methodsLabel = array_map(function($item) { return $item['label']; }, $methods);
      

      【讨论】:

      • 没有意识到您需要 PHP5.3 之前的版本。
      • 稍后添加... ;) 在我看到您的解决方案之后。
      【解决方案7】:

      当然,使用array_map:

      function getLabelFromMethod($method) {
         return $method['label'];
      }
      
      $labels = array_map('getLabelFromMethod', $methods);
      

      如果您使用的是 PHP 5.3+,您还可以使用 lambda 函数:

      $labels = array_map(function($m) {
         return $m['label'];
      }, $methods);
      

      【讨论】:

      • 好的,但这仍然是 3 行代码,还需要定义一个额外的方法。 :( 目前我在 PHP 中寻找一个不错的解决方案
      • 除了array_map()没有其他解决方案了吗?
      • 我尝试了类似的方法,但速度非常慢。直接使用 foreach 更快。
      • foreach 在这种情况下对我来说似乎“丑陋”。
      猜你喜欢
      • 2011-09-27
      • 2020-03-17
      • 2013-08-08
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 2018-03-14
      • 2018-08-07
      • 2012-08-16
      相关资源
      最近更新 更多