按自定义顺序按键排序数组

时间:2015-06-23 09:59:49

标签: php arrays sorting

我有以下多维数组

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功能。任何帮助都会很棒!

由于

2 个答案:

答案 0 :(得分:1)

您可以使用以下比较功能:

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

此代码示例为here

答案 1 :(得分:0)

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

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

代码:(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,
    ),
  ),
)