【问题标题】:Extract ids from multi-dimensional array从多维数组中提取 id
【发布时间】:2013-12-06 16:30:03
【问题描述】:

我有一个要转换的数据库记录数组:

array(2) {
  [0]=>
  array(1) {
    ["ID"]=>
    string(1) "2"
  }
  [1]=>
  array(1) {
    ["ID"]=>
    string(1) "3"
  }
}

到这里:

array(2) {
  [0]=>
    string(1) "2"
  [1]=>
    string(1) "3"
}

我正在寻找性能最快/最简单的解决方案。

我找不到任何 PHP 函数。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    在 PHP 5.5 或更高版本上,最简单的解决方案是使用 PHP 的内置 array_column() 函数。

    $ids = array_column($arr, 'ID');
    

    【讨论】:

    • @ChrisForrence 他们现在是。 :)
    • 不错的解决方案!但这仅在 PHP 5.5+ 中可用
    • @AlexanderYancharuk 这确实值得一提。我更新了我的答案。
    【解决方案2】:
    $bas = array();
    foreach ($foo as $bar) {
        $bas[] = $bar['ID'];
    }
    
    print_r($bas);
    

    $foo 是您的原始数组,$bas 是您想要将其转换为的数组。

    【讨论】:

      【解决方案3】:

      我写了一个简单的测试来找到它们之间的最佳解决方案:

      // foreach
      foreach ($array as $element) { $result[] = $element['ID']; }
      // array_map
      array_map(function($element) { return $element['ID']; }, $array);
      // array_push
      foreach ($array as $element) { array_push($result, $element['ID']); }
      

      结果:

      Test name   Repeats         Result          Performance    
      foreach     1000            0,009204 sec    +0% 
      array_push  1000            0,015731 sec    -70,915%
      array_map   1000            0,024891 sec    -170,437%
      

      它们有时会略有不同,但foreach 始终是最好的,具有出色的性能结果。所以,似乎@campari 的答案必须是最佳答案。但我没有测试@kba 解决方案,因为我使用的是 PHP 5.4。我怀疑array_column 算法会显示出更好的结果。

      此处测试代码:link

      【讨论】:

      • 谢谢。我怀疑是这样。请参阅 JavaScript 的 map here 的这些性能数据。不过,如果您负担得起,array_map 绝对是一个强大且方便的选择,它可以利用自己的堆栈分配 - 当然,管理“奢侈”是速度方面的关键。
      【解决方案4】:

      您的输入数据(丰富了其他数据类型,-用于测试-)并假设您使用的是最新的 PHP 版本:

      $input = array(
          0=>
          array(
              "ID"=>  "2"
          ),
          1=>
          array(
              "ID"=>  "3"
          ),
          "iamnotanarray", 100, null
      );
      

      示例:

      $out = array_map( function($el){ return @current($el);}, $input);
      

      一般:

      $out = array_combine(
          array_keys($ret)
          ,array_map( function($el){ return @current($el);}, $ret)
      )
      

      输出:

      var_export($out);
      
      array (
          0 => '2',
          1 => '3',
          2 => NULL,
          3 => NULL,
          4 => NULL,
      )
      
      var_dump($out);
      
      array(5) {
        [0]=>
        string(1) "2"
        [1]=>
        string(1) "3"
        [2]=>
        NULL
        [3]=>
        NULL
        [4]=>
        NULL
      }
      

      要过滤可能不需要的数据类型,您可以使用:

      $out = array_filter($out, is_string);
      var_dump($out);
      array(2) {
        [0]=>
        string(1) "2"
        [1]=>
        string(1) "3"
      }
      

      我没有计时(),但这是使用 PHP 的原生预编译函数。速度因 PHP 可执行文件的 gcc 编译器优化而异。

      注意: @current 很脏,不推荐使用,只是为了简洁/可读性。它会产生与is_array($el) ? current($el) : NULL; 相同的效果

      【讨论】:

        【解决方案5】:

        试试这个-

        $newArr = array();
        foreach($array as $a)  // $array is original array 
        {
            array_push($newArr, $a["ID"]);
        }
        print_r($newArr);
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2020-06-11
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        相关资源
        最近更新 更多