【问题标题】:Sort array by keys in custom order按自定义顺序按键对数组进行排序
【发布时间】:2015-06-23 09:59:49
【问题描述】:

我有以下多维数组

Array
(
    [June 2015] => Array
        (
            [LOW] => Array
                (
                    [0] => 160.50
                )

            [MEDIUM] => Array
                (
                    [0] => 0.00
                )

            [HIGH] => Array
                (
                    [0] => 60.80
                )

        )

    [July 2015] => Array
        (
            [MEDIUM] => Array
                (
                    [0] => 226.00
                )

            [HIGH] => Array
                (
                    [0] => 263.00
                )

            [LOW] => Array
                (
                    [0] => 121.96
                )

        )

)

我需要按每个内部数组的键对它们进行排序,使它们的顺序为 LOW、MEDIUM、HIGH(第一个是偶然正确的)。

我尝试了以下从here 获取并调整的代码:

function cmp($a, $b){
        $a = preg_replace('@^(LOW|MEDIUM|HIGH) @', '', $a);
        $b = preg_replace('@^(LOW|MEDIUM|HIGH) @', '', $b);
        return strcasecmp($a, $b);
    }

    foreach($live_quotations as $exp_conversion_date => $Aconversion_likelihood){
        foreach($Aconversion_likelihood as $conversion_likelihood => $quotation_values){

            uksort($live_quotations[$exp_conversion_date], "cmp");

        }
    }

但这会将它们排序为 HIGH、MEDIUM、LOW(按字母顺序升序)。如果我更改 cmp 函数中的顺序并不重要,它们总是以这种方式排序。我认为我没有正确理解这个 uksort 或 cmp 函数。任何帮助都会很棒!

谢谢

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    您可以使用以下比较函数:

    function cmp($a, $b) {
        $order = Array( 'LOW' => 0, 'MEDIUM' => 1, 'HIGH' => 2 );
        return $order[$a] - $order[$b];
    }
    

    此代码的示例是here

    【讨论】:

    • 您从 PHP 手册中提供的示例是从键的开头删除单词 aanthe,并使用其余部分来提供排序顺序。
    【解决方案2】:

    因为您的所有子数组都具有所有三个指定键,您可以消除一些复杂性。内循环可以省略,不需要排序算法。另外,如果您希望在缺少元素时建立默认元素,这也提供了该功能。

    下面,您建立一个有序数组,然后用每个出现的子数组值覆盖默认值。这可以通过“通过引用修改”来实现,但我遵循您发布的 sn-p 中的样式。

    代码:(Demo)

    $ordered_defaults = array_fill_keys(['LOW', 'MEDIUM', 'HIGH'], 0);
    
    foreach ($live_quotations as $date => $likelihoods) {
        $live_quotations[$date] = array_replace($ordered_defaults, $likelihoods);
    }
    
    var_export($live_quotations);
    

    输出:

    array (
      'June 2015' => 
      array (
        'LOW' => 
        array (
          0 => 160.5,
        ),
        'MEDIUM' => 
        array (
          0 => 0.0,
        ),
        'HIGH' => 
        array (
          0 => 60.8,
        ),
      ),
      'July 2015' => 
      array (
        'LOW' => 
        array (
          0 => 121.96,
        ),
        'MEDIUM' => 
        array (
          0 => 226.0,
        ),
        'HIGH' => 
        array (
          0 => 263.0,
        ),
      ),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 2012-06-02
      • 2014-04-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多