首页 > 解决方案 > 如何使用动态键对 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 的输出,它返回一个布尔值而不是排序数组。

如何按值(高 - 低)对父数组中的子数组进行排序?

标签: phparrays

解决方案


您可以这样尝试(如果您想保留索引“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
                    )
            )
    )

推荐阅读