Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中根据多维数组对多维数组进行排序?_Php_Arrays_Multidimensional Array - Fatal编程技术网

如何在php中根据多维数组对多维数组进行排序?

如何在php中根据多维数组对多维数组进行排序?,php,arrays,multidimensional-array,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] =

我几乎要疯了—— 我希望你能帮忙;也许很简单,但我现在真的被卡住了

我有以下无序数组:

$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 ) 
...
我认为提前回答“Doublete问题”很重要

-

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

$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 ) 
请注意:本例中的“维度”为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] => ) ) 
请注意,Doublete也位于正确的位置:[126]和[149]

你会怎么做? 谢谢你的建议


提前非常感谢

这里有两个选项:使用
uasort
uksort
。如果使用
uasort
,您将面临的问题是重复的情况。从您的预期输出来看,如果数组相同,那么它们应该按键排序。在
uasort
比较功能中,您将无法访问这些键

因此,您必须使用
uksort
并使用该键索引到
variations\u extract
数组中,并比较这两个值。比较函数相对简单,因为我们有不同的维度和
唯一的属性值
数组

代码如下:

<?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”函数范围内使用的全局变量,也就是“全局”范围之外的变量。

Dude,我想就是这样!令人惊叹的!我只需要对您的答案做一些小的修改,也许您可以在以下内容中编辑它们:(1)在uksort()中调用“cmp”函数之前,需要先定义它。或者,可以使用uksort()索引中的匿名函数——就像我现在所做的那样。(2) 首先需要初始化“cmp”函数作用域中使用的全局变量(也在此作用域之外)。那就好了!(可能行为取决于php版本?)(哦,还有:很抱歉回答得有点晚,但我的显卡在第二天早上发布了这个问题后就死了 …)您提到的问题看起来确实取决于特定的版本或特定的设置。它在这里运行良好: