如何在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版本?)(哦,还有:很抱歉回答得有点晚,但我的显卡在第二天早上发布了这个问题后就死了 …)您提到的问题看起来确实取决于特定的版本或特定的设置。它在这里运行良好: