【问题标题】:what's the best way to order an array using another in PHP?在 PHP 中使用另一个数组排序数组的最佳方法是什么?
【发布时间】:2018-12-01 14:09:28
【问题描述】:

假设我有一个要排序的数组,并且顺序不是可计算的,而是由另一个数组给出,该数组按所需顺序列出了键:

$ordering_array = [
    'c',
    'a',
    'k',
    'e',
];

作为一个额外的复杂因素,并非所有这些键都可能存在于我的数组中以进行排序:

$given_array = [
    'a' => 'value',
    'c' => 'value',
    'e' => 'value',
];

实现这一目标的最干净/最快的方法是什么?

我的方法是:

$new_array = array_fill_keys($ordering_array, NULL);

foreach ($given_array as $key => $value) {
  $new_array[$key] = $value;
}

$new_array = array_filter($new_array);

有没有更好的办法?

【问题讨论】:

标签: php


【解决方案1】:

您可以将foreach 替换为array_replace()

$new_array = array_fill_keys($ordering_array, NULL);
$new_array = array_replace($new_array, $given_array);
$new_array = array_filter($new_array);

【讨论】:

    【解决方案2】:

    你可以试试这个

    $filteredKeys = array_intersect_key(array_flip($ordering_array), $given_array);
    $outputArray = array_merge($filteredKeys, $given_array);
    

    【讨论】:

    • @C2486 已修复,请立即查看
    【解决方案3】:

    在 foreach 的地方使用array_merge()array_replace,两者都有效

    试试这个:

    $ordering_array = ['c', 'a', 'k', 'e'];
    $given_array = ['a' => 'value', 'c' => 'value', 'e' => 'value'];
    
    $new_array = array_fill_keys($ordering_array, NULL);
    
    $new_array = array_merge($new_array, $given_array);
                           OR
    $new_array = array_replace($new_array, $given_array);
    
    $new_array = array_filter($new_array);
    

    【讨论】:

    【解决方案4】:

    这是一个解决它的oneliner:

    $ordering_array = ['c', 'a', 'k', 'e'];
    $given_array = ['a' => 'value', 'c' => 'value', 'e' => 'value'];
    $outputArray = array_merge(array_intersect_key(array_flip($ordering_array), $given_array), $given_array);
    print_r($outputArray);
    

    @rkj 很接近,但这就是它的完成方式

    在这里测试:http://sandbox.onlinephpfunctions.com/code/95b30f6e402b1afdb18867471888ff8ba38867de

    【讨论】:

      【解决方案5】:

      尝试使用uksort

      demo

      <?php 
          $ordering_array  = [
              'c',
              'a',
              'k',
              'e',
          ];
          $given_array  = [
              'a' => 'value-a',
              'c' => 'value-c',
              'e' => 'value-e',
          ];
      
          uksort($given_array , function ($a, $b) use ($ordering_array) {
      
              $pos_a = array_search($a,$ordering_array);
              $pos_b = array_search($b,$ordering_array);
              return $pos_a - $pos_b;
          });
      
          var_dump($given_array );
      

      【讨论】:

      • 如果你翻转 ordering_array 你可以扔掉 array_search 行,并将返回更改为:return $ordering_array[$a] - $ordering_array[$b];
      【解决方案6】:

      简单明了:

      <?php    
      $ordering_array = [
          'c',
          'a',
          'k',
          'e',
      ];
      
      $given_array = [
          'a' => 'valuea',
          'c' => 'valuec',
          'e' => 'valuee',
      ];
      
      foreach($ordering_array as $K)
          if(array_key_exists($K, $given_array))
              $ordered[$K] = $given_array[$K];
      
      var_export($ordered);
      

      输出:

      array (
        'c' => 'valuec',
        'a' => 'valuea',
        'e' => 'valuee',
      )
      

      如果数据允许,您可以使用isset($given_array[$K]) 减少一两个字节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 2010-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        相关资源
        最近更新 更多