按键对多维数组的第一层和第三层进行排序

问题描述 投票:0回答:3

我有这个多维数组,称为

$rent
:

Array
(
    [product2] => Array
        (
            [dates] => Array
                (
                    [2013-07-25] => 2
                    [2013-07-23] => 1
                    [2013-07-21] => 3
                )

        )

    [product3] => Array
        (
            [dates] => Array
                (
                    [2013-07-24] => 5
                    [2013-07-22] => 4
                    [2013-07-20] => 3
                )

        )

    [product1] => Array
        (
            [dates] => Array
                (
                    [2013-07-29] => 1
                    [2013-07-28] => 2
                    [2013-07-27] => 2
                )

        )

)

我想做双重排序:

  1. 首先,按productX升序
  2. 然后,对于每种产品,按租金升序日期

因此得到的数组将是:

Array
(
    [product1] => Array
        (
            [dates] => Array
                (
                    [2013-07-27] => 2
                    [2013-07-28] => 2
                    [2013-07-29] => 1
                )

        )

    [product2] => Array
        (
            [dates] => Array
                (
                    [2013-07-21] => 3
                    [2013-07-23] => 1
                    [2013-07-25] => 2
                )

        )

    [product3] => Array
        (
            [dates] => Array
                (
                    [2013-07-20] => 3
                    [2013-07-22] => 4
                    [2013-07-24] => 5
                )

        )

)

我怎样才能达到这个目标?非常感谢提前

php sorting multidimensional-array key
3个回答
1
投票

试试这个:

ksort($rent);
foreach($rent as &$item) {
    ksort($item['dates']);
}

1
投票

您可以简单地对产品进行ksort,然后迭代它们并将其用于日期键。

ksort($products);

foreach($products as &$product)
    ksort($product['dates']);

其中

$products
是您向我们展示的数组。请注意,您需要将 foreach 循环中的值作为引用传递(使用
&
运算符),否则更改将不会在原始数组中更新。


1
投票

为了我对你的问题的理解; Nadh 解决方案已经差不多了。但我相信你想要 ksort()

这是我对 Nadh 答案的更正

ksort($rent);

foreach($rent as $product => $dates) {
    ksort($rent[$product]['dates']);
}

print_r($rent);
© www.soinside.com 2019 - 2024. All rights reserved.