0

我有以下一周中的几天数组,每一天都有一天中的几个小时(整个数组代表兼职员工的日程安排):

Array
    (
        [7] => Array
            (
                [0] => 15
                [1] => 14
                [2] => 13
                [3] => 11
                [4] => 12
                [5] => 10
            )

        [1] => Array
            (
                [0] => 10
                [1] => 13
                [2] => 12
            )

        [6] => Array
            (
                [0] => 14
            )

        [3] => Array
            (
                [0] => 4
                [1] => 5
                [2] => 6
            )

    )

我只需要:

  1. 按每个子数组排序(第二维) - 无需维护数字键,值是整数
  2. 按第一维排序并维护数字、整数键

IE:

Array
    (
        [1] => Array
            (
                [0] => 10
                [1] => 12
                [2] => 13
            )

        [3] => Array
            (
                [0] => 4
                [1] => 5
                [2] => 6
            )

        [6] => Array
            (
                [0] => 14
            )

        [7] => Array
            (
                [0] => 10
                [1] => 11
                [2] => 12
                [3] => 13
                [4] => 14
                [5] => 15
            )

    )

附加信息:

  1. 只有第一维的键和第二维的值(当然还有它们的关联)对我的用例有意义
  2. 第一个维度最多可以有 7 个值,范围从 1-7(一周中的几天),并且至少有 1 个值(1 天)
  3. 第 2 个维度最多可以有 24 个值,范围从 0-23(每天的小时数),并且至少有 1 个值(每天 1 小时)

我知道我可以foreach对整个ksorted 数组和sort每个二维数组执行此操作:

ksort($sched);
foreach ($sched as &$array) sort($array);
unset($array);

但我希望我可以用原生 php 数组函数来实现这一点。

我的搜索让我尝试array_multisort(array_values($array), array_keys($array), $array),但我无法让它发挥作用。

4

3 回答 3

0

归根结底,您确实有两个分类任务要完成。第一个是按键对外部数组进行排序。第二种是按值对内部数组进行排序。两种排序都是相互独立的。

最好的解决方案是您已经找到的解决方案。array_multisort() 对您没有帮助,因为这是为实际上相互依赖的排序而设计,例如“按姓氏排序 - 如果相等,则按名字排序”。但它确实应该避免,因为定义排序函数并使用usort()和朋友更好地传达你实际排序的内容。

于 2012-10-13T09:31:36.270 回答
-1

尝试以下行

array_multisort(array_values($array), array_keys($array), ksort($array))

这可能会引发警告,但如果它确实解决了问题,您可以通过error_reporting(0)避免它。

于 2012-05-24T07:25:33.893 回答
-1

这是我们能做的最好的:

ksort($arr);
foreach ($arr as $k => $v)
  array_multisort($arr[$k]);
于 2012-05-24T07:02:42.220 回答