Как отсортировать массив JSON с помощью PHP - PullRequest
7 голосов
/ 21 марта 2012

Прежде всего, я новичок в этом, я искал решения, но, похоже, ни один из них не сработал.

Итак, я пытаюсь отсортировать этот массив 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"},
...

Итак, я получаю такие данные

$data=file_get_contents('jsondata...');
$d=json_decode($data,true);

Я бы хотел отсортировать данные по дате, есть идеи, как мне к этому подойти? Можно ли также вернуть только значение года? Таким образом, результат будет 2009 вместо 2009-04-11?

Заранее спасибо

Ответы [ 4 ]

13 голосов
/ 21 марта 2012

Вы можете использовать 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'];
});

<=> работает со строками здесь, потому что сравнение строк - это также сравнение дат, когда ваши даты отформатированы как ГГГГ-ММ-ДД.

Затем, чтобы показать значение года для записи, вы можете разобрать дату в DateTime и переформатировать ее:

$date = DateTime::createFromFormat('Y-m-d', $item['date']);
$year = $date->format('Y');

Вот демонстрация.

0 голосов
/ 21 марта 2012

Что-то вроде следующего должно помочь вам начать:

<?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);
0 голосов
/ 21 марта 2012

Используйте 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);
});

Будет выводить

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
        )

)
0 голосов
/ 21 марта 2012

Вы должны сначала преобразовать дату в сортируемый формат.Я думаю, что strtotime() делает работу.После этого вы можете вывести что угодно с помощью strftime().

...