【问题标题】:PHP multidimensional array sort by valuePHP多维数组按值排序
【发布时间】:2019-04-01 19:44:41
【问题描述】:

关于这个多维数组:

[
(int) 7 => [
    (int) 0 => [
        (int) 0 => '12:45',
        (int) 1 => 'E1',
        (int) 2 => 'B EXTREME 30'
    ],
    (int) 1 => [
        (int) 0 => '10:15',
        (int) 1 => 'E1',
        (int) 2 => 'B SHAPE 30'
    ],
],
(int) 1 => [
    (int) 0 => [
        (int) 0 => '09:30',
        (int) 1 => 'E2',
        (int) 2 => 'CYCLING VIRTUAL 50'
    ],
    (int) 1 => [
        (int) 0 => '10:30',
        (int) 1 => 'E1',
        (int) 2 => 'BODY PUMP VIRTUAL 60'
    ],
    (int) 2 => [
        (int) 0 => '11:45',
        (int) 1 => 'E1',
        (int) 2 => 'BODY BALANCE VIRTUAL 60'
    ],
],
(int) 2 => [
    (int) 0 => [
        (int) 0 => '14:45',
        (int) 1 => 'E2',
        (int) 2 => 'CYCLING VIRTUAL 50'
    ],
    (int) 1 => [
        (int) 0 => '17:00',
        (int) 1 => 'E1',
        (int) 2 => 'POSTURA ALONGAMENTO 60'
    ],
    (int) 2 => [
        (int) 0 => '09:15',
        (int) 1 => 'E1',
        (int) 2 => 'BODY PUMP 50'
    ],
]
]

每个第一级数组的第一个键是星期几(第 7 天、第 1 天和第 2 天)。

每个第一级数组中的数组包含小时(09:45)、房间(E1)和描述(B EXTREME 30)。

我尝试按二级数组小时值对这个多维数组进行排序。 我使用usort()ksort()array_multisort() 和一些自定义函数来对数组进行排序,但没有运气。

内部数组必须按升序排序,如下所示(以第 2 天为例):

09:15 -> 14:45 -> 17:00

有谁知道我怎样才能做到这一点?

【问题讨论】:

  • 所以你不想像标题所说的那样按键排序,而是按每个子数组中的时间排序?
  • 是的...我需要按时间排序。抱歉...我将编辑问题。
  • 请发布预期输出

标签: php arrays sorting multidimensional-array


【解决方案1】:

假设您的数据名为$data。迭代外部数组,并根据时间部分(在最里面的数组中)对每个中级数组进行排序。由于您的时间总是被格式化为“hh:ss”,usort 回调中的字符串比较就可以完成这项工作:

foreach ($data as &$events) {
    usort($events, function($a, $b) {
        return strcmp($a[0], $b[0]);
    });
}

注意foreach 中的&:这样可以确保您对原始数据进行排序,而不是对它的副本进行排序。

如果你想创建一个数组,比如说$result,那么就这样做(这里没有&!):

foreach ($data as $day => $events) {
    usort($events, function($a, $b) {
        return strcmp($a[0], $b[0]);
    });
    $result[$day] = $events;
}

【讨论】:

  • 不走运,结果是一个空数组。 $ar = []; foreach ($mapadeaulas_mobile as &$events) { usort($events, function($a, $b) { $ar = strcmp($a[0], $b[0]); }); }
  • 在这里工作:3v4l.org/TgMc6 $ar 是什么?此解决方案对 original 数组中的结果进行排序。如果您想要$ar 中的结果,则首先将数组分配给$ar 并在$ar 上执行foreach。做$ar = strcmp(...) 毫无意义。你必须 return strcmp(...)
  • 查看我的答案。
  • 谢谢。 usort() 加上 strcmp() 以正确的方式按时间排序数组。
【解决方案2】:

usort — 使用用户定义的比较函数按值对数组进行排序。 让我们创建一个函数来比较两个事件的时间。

这是你的数组的一部分

$array = [
    2 => [
        0 => [
            0 => '14:45',
            1 => 'E2',
            2 => 'CYCLING VIRTUAL 50'
        ],
        1 => [
            0 => '17:00',
            1 => 'E1',
            2 => 'BODY PUMP VIRTUAL 60'
        ],
        2 => [
            0 => '09:15',
            1 => 'E1',
            2 => 'BODY BALANCE VIRTUAL 60'
        ],
    ],
];

这是一个如何对一天(第 2 天)的项目进行排序的示例

usort($array[2], function ($a, $b) {
    $time_a = strtotime($a[0]); // convert string to a unix timestamp to compare int
    $time_b = strtotime($b[0]);
    return $time_a - $time_b;
});

使用print_r($array);输出

Array
(
    [2] => Array
        (
            [0] => Array
                (
                    [0] => 09:15
                    [1] => E1
                    [2] => BODY BALANCE VIRTUAL 60
                )

            [1] => Array
                (
                    [0] => 14:45
                    [1] => E2
                    [2] => CYCLING VIRTUAL 50
                )

            [2] => Array
                (
                    [0] => 17:00
                    [1] => E1
                    [2] => BODY PUMP VIRTUAL 60
                )

        )

)

要在循环中对我们所做的所有日子进行排序,使用& 将每一天的数组作为引用传递:

foreach ($array as &$day) {
    usort($day, function ($a, $b) {
        $time_a = strtotime($a[0]);
        $time_b = strtotime($b[0]);
        return $time_a - $time_b;
    });
}

【讨论】:

  • 谢谢你,尼克,你的回答总是对数组排序很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多