сделать заказ в JSON декодировать - PullRequest
4 голосов
/ 20 ноября 2011
 [
        {
            "id": "123",
            "name": "aaa"
        },
        {
            "id": "567",
            "name": "bbb"
        },
        {
            "id": "469",
            "name": "ccc"
        },
        {
            "id": "577",
            "name": "ddd"
        },
        {
            "id": "388",
            "name": "eee"
        }
]

Как сделать заказ при декодировании json?

$data = json_decode($json);
foreach ($data as $row) {    
    sort($row)?
}

Мне нужны все данные декодирования, чтобы сделать order by id.

Окончательный вывод данных: "name": "aaa", "name": "eee", "name": "ccc", "name": "bbb", "name": "ddd"

1 Ответ

6 голосов
/ 20 ноября 2011

Вы можете использовать usort().

$data = json_decode($json);
usort($data, function($a, $b) {
    if ($a->id == $b->id) {
        return 0;
    }
    return $a->id < $b->id ? -1 : 1;
});

Или, если вы используете PHP <5.3, вам нужно определить функцию сравнения, так как поддержка анонимных функций была добавлена ​​в PHP 5.3. </p>

function cmp($a, $b) {
    if ($a->id == $b->id) {
        return 0;
    }
    return $a->id < $b->id ? -1 : 1;
}
$data = json_decode($json);
usort($data, 'cmp');

Это отсортировало бы массив. После этого, если вы хотите создать массив только со значениями name, вы можете сделать это с помощью foreach.

$result = array();
foreach ($data as $entry) {
    $result[] = array('name' => $entry->name);
}

Переменная $result теперь будет содержать:

array(array('name' => 'aaa'),
      array('name' => 'eee'),
      array('name' => 'ccc'),
      array('name' => 'bbb'),
      array('name' => 'ddd'));

Затем, чтобы снова закодировать результат в JSON, вы можете вызвать json_encode().

echo json_encode($result);

Будет выведена строка, похожая на:

[{"name": "aaa"},
 {"name": "eee"},
 {"name": "ccc"},
 {"name": "bbb"},
 {"name": "ddd"}]
...