我几乎忘记了 - 我希望你能帮忙;也许这很简单,但我现在真的被困住了。
我有以下无序的数组数组:
$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]。
你会怎么做? 我很感激任何建议!
非常感谢你!
答案 0 :(得分:1)
您有2个选项:使用uasort
或uksort
。如果您使用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'。