php - 如何使用动态键对 3 级多维数组进行排序?
问题描述
我尝试为我的 3 级多维数组实现解决方案。当我意识到我不能使用键名来定位值时,问题就出现了,因为它们是动态创建的(SKU 样式)。
我的数组数据的略读版本:
Array
(
['weeks'] => Array
(
[14] => Array
(
[some_sku] => 28.5
[some_sku_1] => 10.8
[some_sku_2] => 11.21
[some_sku_3] => 19.98
[some_sku_4] => 20.79
)
[31] => Array
(
[some_sku_1] => 28.5
[some_sku_5] => 10.8
[some_sku_6] => 11.21
[some_sku_7] => 19.98
[some_sku_9] => 20.79
)
)
)
我想也许我可以对“母舰”数组中的各个数组进行排序,但这似乎并没有达到我想要的效果:
foreach ($data as $item)
{
foreach ($item as $el)
{
usort($el, function($a, $b){return $a > $b;});
}
}
但数据保持不变:https ://3v4l.org/E6W8Z
我的猜测是,虽然它可能会发生,但它不会将值存储在数组中。我也不能分配usort()
as 的输出,它返回一个布尔值而不是排序数组。
如何按值(高 - 低)对父数组中的子数组进行排序?
解决方案
您可以这样尝试(如果您想保留索引“some_sku_”,请注意 uasort 而不是 usort):
foreach($data as $key1 => $value1)
{
foreach($value1 as $key2 => $value2)
{
uasort($value2, function($a, $b)
{
return strcasecmp($a, $b);
});
$value1[$key2] = $value2;
}
$data[$key1] = $value1;
}
简化成这个(注意“&”允许通过引用分配该数组,允许直接处理原始变量,也没有“&”,变量丢失,所以在这种情况下,你需要第一个解决方案“ $data[$key]=$val") :
foreach($data as &$child1)
{
foreach($child1 as &$child2)
{
uasort($child2, function($a, $b)
{
return strcasecmp($a, $b);
});
}
}
结果 :
Array
(
[weeks] => Array
(
[14] => Array
(
[some_sku_1] => 10.8
[some_sku_2] => 11.21
[some_sku_3] => 19.98
[some_sku_4] => 20.79
[some_sku] => 28.5
)
[31] => Array
(
[some_sku_5] => 10.8
[some_sku_6] => 11.21
[some_sku_7] => 19.98
[some_sku_9] => 20.79
[some_sku_1] => 28.5
)
)
)