如何根据php中的multidim数组对multidim数组进行排序?

时间:2014-03-19 12:31:53

标签: php arrays multidimensional-array

我几乎忘记了 - 我希望你能帮忙;也许这很简单,但我现在真的被困住了。

我有以下无序的数组数组:

$variations_excerpt =
Array ( [4288] => Array ( [pa_farbe] => white-default [pa_groesse] => xl ) 
         [128] => Array ( [pa_farbe] => black-default [pa_groesse] => s )
         [130] => Array ( [pa_farbe] => black-default [pa_groesse] => xxl )
        [4289] => Array ( [pa_farbe] => white-default [pa_groesse] => xxl )
         [127] => Array ( [pa_farbe] => black-default [pa_groesse] => m ) 
         [129] => Array ( [pa_farbe] => black-default [pa_groesse] => xl ) 
        [4286] => Array ( [pa_farbe] => [pa_groesse] => )
         [149] => Array ( [pa_farbe] => black-default [pa_groesse] => l )
        [4287] => Array ( [pa_farbe] => white-default [pa_groesse] => s )
         [126] => Array ( [pa_farbe] => black-default [pa_groesse] => l )
        [4290] => Array ( [pa_farbe] => white-default [pa_groesse] => ) )

(我不想强调这一点,但请注意其中散布着空值(='')。这意味着就是这样。)

另一个注意事项:在某些奇怪的情况下,确实存在双重特征。在这个例子中确实存在:

...
[126] => Array ( [pa_farbe] => black-default [pa_groesse] => l )
...
[149] => Array ( [pa_farbe] => black-default [pa_groesse] => l ) 
...

我认为回答双重问题'提前。 ;)

-

现在,上面的无序数组需要根据以下数组进行排序,提供所有值的所需顺序。我已经设法做到了:

$unique_attribute_values = 
Array ( [pa_farbe] => Array ( [0] => black-default [1] => white-default [2] => ) 
      [pa_groesse] => Array ( [5] => s [6] => m [7] => l [8] => xl [9] => xxl [10] => ) ) 

(空值(='')向末尾移动。)

此外,我已经知道,有多少'尺寸'这样一个数组会有什么名称'其中,属性:

$dim = 0;
$dim_names = array();
foreach ($unique_attribute_values as $attr => $val) {
    $dim++;
    $dim_names[$dim] = $attr; 
    }

...导致:

$dim = 2;
$dim_names = Array ( [1] => pa_farbe 
                     [2] => pa_groesse ) 

请注意:&#39;维度&#39;在这个例子中是2 - 但维度可以从1到n变化(在实践中n几乎总是<4)。但由于它有点未知,我认为确定维度并且可以使用名称(=键)是一个好主意,可能是为了将来的for循环。 (?)

-

无论如何,我需要达到的结果如下:

$ordered_excerpt = 
Array ( [128] => Array ( [pa_farbe] => black-default [pa_groesse] => s ) 
        [127] => Array ( [pa_farbe] => black-default [pa_groesse] => m )
        [126] => Array ( [pa_farbe] => black-default [pa_groesse] => l )
        [149] => Array ( [pa_farbe] => black-default [pa_groesse] => l )
        [129] => Array ( [pa_farbe] => black-default [pa_groesse] => xl ) 
        [130] => Array ( [pa_farbe] => black-default [pa_groesse] => xxl )
       [4287] => Array ( [pa_farbe] => white-default [pa_groesse] => s )
       [4288] => Array ( [pa_farbe] => white-default [pa_groesse] => xl ) 
       [4289] => Array ( [pa_farbe] => white-default [pa_groesse] => xxl ) 
       [4290] => Array ( [pa_farbe] => white-default [pa_groesse] => )
       [4286] => Array ( [pa_farbe] => [pa_groesse] => ) ) 

请注意,双击也在正确的位置:[126]和[149]。

你会怎么做? 我很感激任何建议!

非常感谢你!

1 个答案:

答案 0 :(得分:1)

您有2个选项:使用uasortuksort。如果您使用uasort,您将面临的问题是重复。根据您的预期输出,似乎如果数组相同,则应按其键排序。在uasort比较功能中,您将无法访问这些键。

因此,您必须使用uksort并使用该键索引variations_excerpt数组并比较这两个值。比较函数相对简单,因为我们有不同的维度和unique_attribute_values数组。

以下是代码:

<?php
$variations_excerpt =
array ( 4288 => array ( 'pa_farbe' => 'white-default', 'pa_groesse' => 'xl' ) ,
         128 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 's' ),
         130 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 'xxl' ),
        4289 => array ( 'pa_farbe' => 'white-default', 'pa_groesse' => 'xxl' ),
         127 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 'm' ) ,
         129 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 'xl' ) ,
        4286 => array ( 'pa_farbe' => '',   'pa_groesse' => ''),
         149 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 'l' ),
        4287 => array ( 'pa_farbe' => 'white-default', 'pa_groesse' => 's' ),
         126 => array ( 'pa_farbe' => 'black-default', 'pa_groesse' => 'l' ),
        4290 => array ( 'pa_farbe' => 'white-default', 'pa_groesse' => '' ) 
        );

$dummy = $variations_excerpt;

$unique_attribute_values = 
array ( 
    'pa_farbe' => array ( 
        0 => 'black-default', 
        1 => 'white-default', 
        2 => '' 
    ), 
     'pa_groesse' => array ( 
        5 => 's', 
        6 => 'm', 
        7 => 'l', 
        8 => 'xl', 
        9 => 'xxl', 
        10 => ''
      )
    );
$dim_names = array('pa_farbe', 'pa_groesse');
uksort($variations_excerpt, "cmp");

function cmp($a, $b) {
    global $dim_names, $unique_attribute_values, $dummy;
    foreach($dim_names as $d) {
        $x = array_search($dummy[$a][$d], $unique_attribute_values[$d]);
        $y = array_search($dummy[$b][$d], $unique_attribute_values[$d]);
        if ($x < $y) {
            return -1;
        } else if ($x > $y) {
            return 1;
        }
    }
    if ($a < $b)
        return -1;
    else
        return 1;
}

print_r($variations_excerpt);

?>

希望它有所帮助。

注意:OP指出的可能问题:

(1)在uksort()中调用之前需要定义'cmp'函数。或者,可以使用uksort()中的匿名函数。

(2)我们需要初始化'cmp'函数范围中使用的全局变量,这些变量也在这个范围之外,首先是'global'。