【问题标题】:Sort multi-dimensional array by date (keys) and time (values)按日期(键)和时间(值)对多维数组进行排序
【发布时间】:2021-09-19 12:33:07
【问题描述】:

假设以下 巨大 数组(我故意没有删除它的任何记录,以便您拥有大量数据,以防有人想深入了解并帮助我找到解决方案问题):

$program = array (
  '2021-07-11' => 
  array (
    0 => 
    array (
      'movie' => 'Movie 1',
      'channel' => 'Channel 10',
      'time' => '23:00',
    ),
    1 => 
    array (
      'movie' => 'Movie 2',
      'channel' => 'Channel 2',
      'time' => '01:15',
    ),
    2 => 
    array (
      'movie' => 'Movie 8',
      'channel' => 'Channel 4',
      'time' => '11:00',
    ),
    3 => 
    array (
      'movie' => 'Movie 12',
      'channel' => 'Channel 11',
      'time' => '17:30',
    ),
    4 => 
    array (
      'movie' => 'Movie 14',
      'channel' => 'Channel 5',
      'time' => '21:00',
    ),
    5 => 
    array (
      'movie' => 'Movie 15',
      'channel' => 'Channel 5',
      'time' => '02:20',
    ),
    6 => 
    array (
      'movie' => 'Movie 17',
      'channel' => 'Channel 11',
      'time' => '17:30',
    ),
    7 => 
    array (
      'movie' => 'Movie 19',
      'channel' => 'Channel 5',
      'time' => '10:00',
    ),
    8 => 
    array (
      'movie' => 'Movie 21',
      'channel' => 'Channel 8',
      'time' => '1:20',
    ),
    9 => 
    array (
      'movie' => 'Movie 33',
      'channel' => 'Channel 5',
      'time' => '00:20',
    ),
    10 => 
    array (
      'movie' => 'Movie 39',
      'channel' => 'Channel 3',
      'time' => '17:30',
    ),
    11 => 
    array (
      'movie' => 'Movie 40',
      'channel' => 'Channel 3',
      'time' => '22:00',
    ),
    12 => 
    array (
      'movie' => 'Movie 41',
      'channel' => 'Channel 5',
      'time' => '14:00',
    ),
    13 => 
    array (
      'movie' => 'Movie 42',
      'channel' => 'Channel 5',
      'time' => '23:00',
    ),
    14 => 
    array (
      'movie' => 'Movie 43',
      'channel' => 'Channel 2',
      'time' => '14:15',
    ),
    15 => 
    array (
      'movie' => 'Movie 44',
      'channel' => 'Channel 2',
      'time' => '18:00',
    ),
    16 => 
    array (
      'movie' => 'Movie 45',
      'channel' => 'Channel 2',
      'time' => '23:45',
    ),
    17 => 
    array (
      'movie' => 'Movie 46',
      'channel' => 'Channel 1',
      'time' => '22:00',
    ),
    18 => 
    array (
      'movie' => 'Movie 47',
      'channel' => 'Channel 6',
      'time' => '21:10',
    ),
  ),
  '2021-07-10' => 
  array (
    0 => 
    array (
      'movie' => 'Movie 3',
      'channel' => 'Channel 2',
      'time' => '14:15',
    ),
    1 => 
    array (
      'movie' => 'Movie 5',
      'channel' => 'Channel 3',
      'time' => '22:00',
    ),
    2 => 
    array (
      'movie' => 'Movie 6',
      'channel' => 'Channel 11',
      'time' => '23:00',
    ),
    3 => 
    array (
      'movie' => 'Movie 7',
      'channel' => 'Channel 4',
      'time' => '11:15',
    ),
    4 => 
    array (
      'movie' => 'Movie 11',
      'channel' => 'Channel 4',
      'time' => '21:00',
    ),
    5 => 
    array (
      'movie' => 'Movie 16',
      'channel' => 'Channel 2',
      'time' => '23:45',
    ),
    6 => 
    array (
      'movie' => 'Movie 20',
      'channel' => 'Channel 4',
      'time' => '23:00',
    ),
    7 => 
    array (
      'movie' => 'Movie 23',
      'channel' => 'Channel 5',
      'time' => '01:00',
    ),
    8 => 
    array (
      'movie' => 'Movie 27',
      'channel' => 'Channel 4',
      'time' => '01:00',
    ),
    9 => 
    array (
      'movie' => 'Movie 29',
      'channel' => 'Channel 7',
      'time' => '02:15',
    ),
    10 => 
    array (
      'movie' => 'Movie 31',
      'channel' => 'Channel 5',
      'time' => '14:00',
    ),
    11 => 
    array (
      'movie' => 'Movie 32',
      'channel' => 'Channel 5',
      'time' => '22:10',
    ),
    12 => 
    array (
      'movie' => 'Movie 36',
      'channel' => 'Channel 2',
      'time' => '00:01',
    ),
    13 => 
    array (
      'movie' => 'Movie 37',
      'channel' => 'Channel 2',
      'time' => '11:30',
    ),
    14 => 
    array (
      'movie' => 'Movie 38',
      'channel' => 'Channel 6',
      'time' => '22:30',
    ),
  ),
  '2021-07-09' => 
  array (
    0 => 
    array (
      'movie' => 'Movie 4',
      'channel' => 'Channel 5',
      'time' => '21:00',
    ),
    1 => 
    array (
      'movie' => 'Movie 9',
      'channel' => 'Channel 11',
      'time' => '22:00',
    ),
    2 => 
    array (
      'movie' => 'Movie 10',
      'channel' => 'Channel 9',
      'time' => '16:45',
    ),
    3 => 
    array (
      'movie' => 'Movie 18',
      'channel' => 'Channel 7',
      'time' => '22:00',
    ),
    4 => 
    array (
      'movie' => 'Movie 22',
      'channel' => 'Channel 5',
      'time' => '23:00',
    ),
    5 => 
    array (
      'movie' => 'Movie 24',
      'channel' => 'Channel 9',
      'time' => '21:00',
    ),
    6 => 
    array (
      'movie' => 'Movie 25',
      'channel' => 'Channel 9',
      'time' => '23:00',
    ),
    7 => 
    array (
      'movie' => 'Movie 26',
      'channel' => 'Channel 4',
      'time' => '21:00',
    ),
    8 => 
    array (
      'movie' => 'Movie 28',
      'channel' => 'Channel 8',
      'time' => '23:00',
    ),
    9 => 
    array (
      'movie' => 'Movie 30',
      'channel' => 'Channel 6',
      'time' => '23:45',
    ),
    10 => 
    array (
      'movie' => 'Movie 34',
      'channel' => 'Channel 3',
      'time' => '23:00',
    ),
    11 => 
    array (
      'movie' => 'Movie 35',
      'channel' => 'Channel 2',
      'time' => '22:00',
    ),
  ),
  '2021-07-12' => 
  array (
    0 => 
    array (
      'movie' => 'Movie 13',
      'channel' => 'Channel 5',
      'time' => '01:20',
    ),
  ),
)

我想按日期(第一个维度的键)和第三个维度的列time 对这个数组进行排序,这样我最终得到一个按日期分组的电影列表,并按它们排序播出时间...

第一个任务是一个超级简单的单行...

array_multisort(array_map('strtotime', array_keys($program)), SORT_ASC, $program);

然而,第二个任务让我很难以类似的优雅方式实现......我尝试的是这样的:

array_multisort(array_map('strtotime', array_keys($program)), SORT_ASC, array_column($program, 'time'), SORT_ASC, $program);

但这不起作用,因为由于某种原因array_column($program, 'time') 返回一个空数组。在manual 中明确指出,数组可以是多维数组或从中提取一列值的对象数组。 所以它可以是多维数组。维,而不是严格的二维数组......为什么它在我的情况下不起作用?我错过了什么?

我的想法是多维数组不能是关联数组,所以为了暂时去掉日期键,我把上面的改成:

array_multisort(array_map('strtotime', array_keys($program)), SORT_ASC, array_column(array_values($program), 'time'), SORT_ASC, $program);

但不幸的是,这也不起作用......

我正在努力以一种聪明/优雅的方式做到这一点,并避免使用循环来遍历每个值,但我已经没有想法了。因此,任何帮助将不胜感激。 TIA。

【问题讨论】:

    标签: php sorting array-multisort


    【解决方案1】:

    好的,我找到了!!!我需要遍历初始数组的每个子数组(通过引用),并在那里执行array_multisort...所以下面的代码成功了,我想它可以做到优雅!!!

    array_multisort(array_map('strtotime', array_keys($program)), SORT_ASC, $program);
    
    foreach ($program as &$day) {
        array_multisort(array_column($day, 'time'), SORT_ASC, $day);
    }
    

    【讨论】:

    • 对于外部数组,您可能可以使用ksort($program)
    • 是的,没错!当我试图将两种排序组合在一个命令中时,我坚持使用array_multisort!现在我将命令一分为二,确实 ksort 时间戳是一个更轻的解决方案!实际上键不是时间戳,但Y-m-d 也可以直接排序!
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多