【问题标题】:Sorting multi-dimensional array in PHP with multiple criteria在 PHP 中使用多个条件对多维数组进行排序
【发布时间】:2013-08-02 20:41:05
【问题描述】:

我正在从 JSON 读取一个多维数组。然后我需要根据数组中大约 3 层的两个参数进行排序。

我试过array_multisort,但一次只能做一个级别。然后,根据我在 stackoverflow 上看到的几个示例,我转向了 usort,但它顽固地拒绝工作。

JSON:

    [
    {
    "multiple parameters": "foobar",
        "projects": [
            {
                "id": "00101",
                "date": "9",
                "time": "14:00",
          "duration":"30"
            },
            {
                "id": "EX001",
                "date": "8",
                "time": "13:30",
          "duration":"15"
            },
            {
                "id": "9A200",
                "date": "10",
                "time": "8:45",
          "duration":"15"
            },
            {
                "id": "EQ002",
                "date": "8",
                "time": "9:30",
          "duration":"15"
            }
        ]
    }
]

PHP:

//read data from the json file
$theschedule = '/directory/path/schedule.json';

//read json file
if (file_exists ($theschedule)){
    $contents = utf8_encode(file_get_contents($theschedule));
    $Schedule= json_decode($contents, true); 

//Sort array

usort($Schedule[0]['projects'], 'order_by_date_time');

function order_by_date_time($a, $b)
{
  if ($a['date'] == $b['date'])
  {
    // date is the same, sort by time
    if ($a['time'] == $b['time']) return 0;
    return $a['time'] == 'y' ? -1 : 1;
  }

  // sort the date first:
  return $a['date'] < $b['date'] ? 1 : -1;
}

每个会议都有日期和时间 - 我需要按日期和时间排序,以填充会议安排页面。

我已经阅读了很多很多 stackoverflow 帖子。最有帮助的是 Sort multidimensional array by multiple criteria

Sort an associative array in php with multiple condition('order_by_date_time' 函数的来源)

我已经阅读了http://www.php.net/manual/en/function.usort.php 上有关 usort 的 PHP 手册(以及许多其他数组排序函数)。

我还使用 JSONLint 验证了 JSON,所以我认为这不是问题 - 但如果这可能是问题,我也可以更改它。

我知道以前在这里提出过相关问题 - 我已经阅读了很多帖子,并尝试了很多建议的答案。但是,我的代码中缺少一些我看不到的部分。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    这应该适合你。

     function order_by_date_time($a, $b){
           if ($a["date"] == $b["date"]){
                return strtotime($a["time"]) - strtotime($b["time"]);
           } 
           return $a["date"] - $b["date"];
     }
    
     usort ($Schedule[0]['projects'], "order_by_date_time");
    

    See Working Fiddle

    【讨论】:

    • strtotime 看起来很有希望,但它仍然没有排序。百思不得其解。我使用的是 5.3.3 版;想不出任何理由让 usort 只是 .. 不排序。
    • 我不知道 Fiddle 有什么魔力,但它确实有效。有用!!!!!很高兴。非常困惑,因为我正在比较两组相同的代码,一组有效,另一组无效……我最终会发现不同之处。但与此同时,快乐的舞蹈。 :) 谢谢!!
    【解决方案2】:

    如何循环遍历所有会议,并添加一个额外的 date_time 字段,这是两个字段的可排序组合。然后你只需要排序一个。

    【讨论】:

    • 好的。作为一种解决方法,这是有效的。我仍在研究如何使页面的其余部分与新系统一起工作 - 当我构建最终日历时,我使用 foreach 循环遍历排序数组,并使用单独的日期字段生成新标题。不过,这并非不可克服 - 尽管现在可以工作。谢谢!
    猜你喜欢
    • 2013-05-02
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    相关资源
    最近更新 更多