【问题标题】:Sort an PHP JSON array by month按月对 PHP JSON 数组进行排序
【发布时间】:2016-07-01 05:47:52
【问题描述】:

我正在尝试按 MONTH 名称缩短数组。

[  
   {  
      "order_id":34,
      "user_id":17,
      "sum":65000,
      "month":"May"
   },
   {  
      "order_id":32,
      "user_id":19,
      "sum":15000,
      "month":"July"
   },
   {  
      "order_id":29,
      "user_id":1,
      "sum":20000,
      "month":"April"
   }
]

有什么方法可以快速排序吗?我需要名称格式的月份。

我期待如下结果。

[  
   {  
      "order_id":29,
      "user_id":1,
      "sum":20000,
      "month":"April"
   },
   {  
      "order_id":34,
      "user_id":17,
      "sum":65000,
      "month":"May"
   },
   {  
      "order_id":32,
      "user_id":19,
      "sum":15000,
      "month":"July"
   }
]

我试过arsortkrsortarray_reverse(),但是这些方法都不能短接。因此,为此寻找其他解决方案。

谢谢! (提前)

【问题讨论】:

  • 是按月份(1 月 2 月 3 月..)还是按月份名称(4 月 8 月 2 月..)排序
  • 我想在 1 月 2 月 3 月之前排序...我猜 reverse_array 会在这里工作吗?
  • No reverse_array() 在这里不起作用。
  • 是的,它是 json 格式
  • 所以先转换成普通的PHP数组不行吗?

标签: php arrays json


【解决方案1】:

这里不能直接应用任何功能,因为你的数据是json格式的,你可以像下面这样实现:-

<?php

$data = '[  
   {  
      "order_id":34,
      "user_id":17,
      "sum":65000,
      "month":"May"
   },
   {  
      "order_id":32,
      "user_id":19,
      "sum":15000,
      "month":"July"
   },
   {  
      "order_id":29,
      "user_id":1,
      "sum":20000,
      "month":"April"
   }
]';

$new_array = json_decode($data,true); // convert json to php array
echo "<pre/>";print_r($new_array); // print original array

usort($new_array, "compare_months"); // using usort with callback function
var_dump($new_array); // your final sorted array

function compare_months($a, $b) {
    $monthA = date_parse($a['month']);
    $monthB = date_parse($b['month']);

    return $monthA["month"] - $monthB["month"];
}
?>

输出:-https://eval.in/598786

参考:-

PHP re-order array of month names

【讨论】:

    【解决方案2】:

    假设您已将 JSON 解码为二维数组,您可以尝试使用 usort 和回调函数来比较您的月份名称

    $json_data = '[  
     {  
      "order_id":34,
      "user_id":17,
      "sum":65000,
      "month":"May"
     },
     {  
       "order_id":32,
       "user_id":19,
       "sum":15000,
       "month":"July"
     },
     {  
      "order_id":29,
      "user_id":1,
      "sum":20000,
      "month":"April"
     }
    ]';
    
    function cmp_by_month($a, $b)
    {
      //Let's compare by month value
      return strtotime($a["month"]) - strtotime($b["month"]);
    }
    
    $data = json_decode($json_data);
    $result = usort($data, 'cmp_by_month');
    

    【讨论】:

    • 又短又甜:)
    • 使用strtotime的好主意
    【解决方案3】:
    • 您需要使用 json_decode 将 JSON 转换为数组。 如果要将数组转换为 JSON,则可以在转换之前执行这些操作。

    • 创建月份数组。

    • 使用usort 方法在$months 的帮助下对数组进行排序。
    • 使用 json_encode 将您的数组转换回 JSON。

    代码

    $json = <<<JSON
    [  
       {  
          "order_id":34,
          "user_id":17,
          "sum":65000,
          "month":"May"
       },
       {  
          "order_id":32,
          "user_id":19,
          "sum":15000,
          "month":"July"
       },
       {  
          "order_id":29,
          "user_id":1,
          "sum":20000,
          "month":"April"
       },
       {  
          "order_id":29,
          "user_id":1,
          "sum":20000,
          "month":"January"
       }
    ]
    JSON;
    $arr = json_decode($json, true);
    $months = [
        'January' => 1,
        'Feburary' => 2,
        'March' => 3,
        'April' => 4,
        'May' => 5,
        'June' => 6,
        'July' => 7,
        'August' => 8,
        'September' => 9,
        'October' => 10,
        'November' => 11,
        'December' => 12
    ];
    usort($arr, function ($x, $y) use($months) {
        return $months[$x['month']] - $months[$y['month']];
    });
    $json = json_encode($arr);
    

    【讨论】:

    • 是的,这也是一种方法。我喜欢你排序的方式。我使用相同的排序。并帮我解决没有任何问题。
    • 感谢您更新它并提供更多分步指南。我相信将来会有很多人参考这个。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多