如何使用 PHP 对 JSON 数组进行排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9808783/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to sort a JSON array with PHP
提问by xtoffer
First of all i'm a complete newbie to this, i have searched for solutions but none seem to do the trick.
首先,我是一个完整的新手,我已经搜索了解决方案,但似乎没有一个能解决问题。
So I am trying to sort this JSON array by date but i don't really know i should tackle this, any tips in the right direction are much appreciated!
所以我试图按日期对这个 JSON 数组进行排序,但我真的不知道我应该解决这个问题,非常感谢任何正确方向的提示!
["info":[
{"id":1, "title":"original title", "name":"john doe", "date":"2010-05-15"},
{"id":2, "title":"another title", "name":"foo bar", "date":"2009-04-11"},
...
So i'm getting the data like this
所以我得到这样的数据
$data=file_get_contents('jsondata...');
$d=json_decode($data,true);
I would like to sort the data by date, any ideas how i should approach this? Is it also possible to return the year value only? So the output would be 2009 instead of 2009-04-11?
我想按日期对数据进行排序,我应该如何解决这个问题?是否也可以只返回年份值?那么输出将是 2009 而不是 2009-04-11?
Thanks in advance
提前致谢
回答by Ry-
You can use usort
and a custom comparison function:
您可以使用usort
和自定义比较函数:
$data = '{"info":[{"id":1, "title":"original title", "name":"john doe", "date":"2010-05-15"}, {"id":2, "title":"another title", "name":"foo bar", "date":"2009-04-11"}]}';
$info = json_decode($data, true)['info'];
usort($info, function ($a, $b) {
return $a['date'] <=> $b['date'];
});
<=>
works on strings here because a string comparison is also a date comparison when your dates are formatted as YYYY-MM-DD.
<=>
此处适用于字符串,因为当您的日期格式为 YYYY-MM-DD 时,字符串比较也是日期比较。
Then, to show the year value for an entry, you can parse the date into a DateTime
and reformat it:
然后,要显示条目的年份值,您可以将日期解析为 aDateTime
并重新格式化:
$date = DateTime::createFromFormat('Y-m-d', $item['date']);
$year = $date->format('Y');
回答by Frank van Wijk
You have to convert the date to a sortable format first. I think that strtotime()
does the job. After that you can output whatever with strftime()
.
您必须先将日期转换为可排序的格式。我认为这样strtotime()
做可以。之后,您可以使用strftime()
.
回答by cypher
Use uasortto sort the array with user-defined function and strtotime to parse the date to timestamp.
使用uasort使用自定义函数对数组进行排序,使用 strtotime 将日期解析为时间戳。
$json = '
{"info":[
{"id":1, "title":"original title", "name":"john doe", "date":"2010-05-15"},
{"id":2, "title":"another title", "name":"foo bar", "date":"2009-04-11"}
]
}';
$arr = json_decode($json)->info;
uasort($arr, function($item1, $item2){
return strtotime($item1->date) > strtotime($item2->date);
});
Will output
会输出
Array
(
[1] => stdClass Object
(
[id] => 2
[title] => another title
[name] => foo bar
[date] => 2009-04-11
)
[0] => stdClass Object
(
[id] => 1
[title] => original title
[name] => john doe
[date] => 2010-05-15
)
)
回答by Andreas Wong
Something like the following should get you started:
类似以下的内容应该可以帮助您入门:
<?php
function sortDate($a, $b) {
return strtotime($a['date']) - strtotime($b['date']);
}
$input = array('info' => array(array('id' => 2, 'date' => '2019-04-11'), array('id' => 1, 'date' => '2010-05-15')));
usort($input['info'], 'sortDate');
print_r($input);