Сортировка вывода json по идентификатору

Я создаю приложение, которое анализирует каналы json в список действий. Я читал, что новые элементы добавляются внизу списка, и это так в моем приложении. Я пытаюсь исправить это, сортируя вывод моего json по идентификатору в порядке убывания. Не знаю, решит ли это мою проблему, или мне нужно исправить ее в моем Java-коде. Часть первая моего вопроса: изменит ли изменение порядка вывода из базы данных порядок, в котором каналы отображаются в приложении? Если это так, я попытался изменить свой php-скрипт, следуя примерам на http://php.net/manual/en/function.usort.php, но порядок не меняется. Часть вторая, что я делаю не так в следующем скрипте php?

<?php


require("config.inc.php");
$query_params=null;


//initial query
$query = "Select * FROM feeds";

//execute query
try {
    $stmt   = $db->prepare($query);
    $result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
    $response["success"] = 0;
    $response["message"] = "Database Error!";
    die(json_encode($response));
}

// Finally, retrieve all of the found rows into an array using fetchAll
$rows = $stmt->fetchAll();

if ($rows) {
    $response["feed"]   = array();

    foreach ($rows as $row) {
        $post             = array();
        $post["id"] = $row["id"];
        $post["name"]    = $row["name"];
    $post["status"] = $row["status"];

        //update our repsonse JSON data
        array_push($response["feed"], $post);
    }

    function cmp($a, $b)
    {
    if ($a->id == $b->id) {
        return 0;
            }
    return ($a->id > $b->id) ? -1 : 1;
    }

    $a = array();
    usort($a, "cmp");

    // echoing JSON response
    echo json_encode($response, JSON_NUMERIC_CHECK);


} else {
    $response["success"] = 0;
    $response["message"] = "No Post Available!";
    die(json_encode($response));
}

?>

person Macharia    schedule 18.03.2015    source источник
comment
вы не можете отсортировать объект json. После синтаксического анализа json-клиента вы можете отсортировать результат синтаксического анализа.   -  person Blackbelt    schedule 18.03.2015


Ответы (1)


Похоже, вы вызываете usort для пустого массива вместо данных, которые вы действительно хотите отсортировать.

Вместо того

$a = array();
usort($a, "cmp");

Пытаться

$a = $response['feed'];
usort($a, "cmp");
$response['feed'] = $a;

Blackbelt прав в том, что вы не можете технически отсортировать массив JSON, по крайней мере, с последовательными индексами (что приводит к отсутствию индексов вообще). На практике, однако, когда вы перебираете результирующий объект на стороне клиента, он будет в том порядке, в котором он был определен, поэтому его сортировка на стороне сервера не должна вызывать никаких проблем.

person rjdown    schedule 18.03.2015
comment
@Blackbelt и rj, говоря «вы не можете технически отсортировать массив json», означает ли это, что то, что я пытаюсь сделать, бесполезно? Большая часть того, что я узнал о json и php и о программировании в целом, я получил из онлайн-руководств, так что простите за мою наивность. Кроме того, я получаю следующую ошибку <br /> <b>Fatal error</b>: Function name must be a string in <b>D:\Program Files\XAMPP\htdocs...., когда внедряю вышеуказанное изменение. Я тестирую с xampp, прежде чем изменять онлайн-сценарий. - person Macharia; 18.03.2015
comment
То, что вы делаете, в порядке, есть вероятность, что при преобразовании JSON в объект / массив на стороне клиента он не обязательно может сохранять порядок. Во многом зависит от клиента. Безопаснее сортировать на стороне клиента, если хотите. Укажите фатальную ошибку, не зная, что там происходит. Код в порядке. В какой строке говорится о проблеме? - person rjdown; 18.03.2015
comment
строка 48, которая равна $a = $response('feed'); - person Macharia; 18.03.2015
comment
Ах, это должны быть квадратные скобки, как в моем примере. $a = $response['feed']; - person rjdown; 18.03.2015
comment
Я также думаю, что вы получите попытку получить свойство ошибки, не связанной с объектом, из вашей функции cmp. Если да, измените все, что выглядит как $a->id, например, на $a['id'] - person rjdown; 18.03.2015
comment
Изменил скобки, он выдал ожидаемую ошибку, изменился на $a["id"], и теперь вывод в порядке, но все еще несортированный - person Macharia; 19.03.2015
comment
Кажется, здесь работает нормально sandbox.onlinephpfunctions.com/code/ (добавлены случайные данные в Топ) - person rjdown; 19.03.2015
comment
Большое вам спасибо !! Работает, было $response["feed"]; вместо $response["feed"] = $a; Еще раз спасибо! - person Macharia; 19.03.2015