Сортировать JSON-кодированный список координат X и Y, используя PHP - PullRequest
0 голосов
/ 12 декабря 2011

Используя PHP, я должен работать с JSON-кодированным потоком, который был инициализирован следующим образом:

set = new Array();
set[n] = {"index": new Array()};
set[n].index[i] = {"x": xLoc, "y": yLoc, "id": "id#"};

, который в конечном итоге экспортируется в JSON-кодированный поток, структура которого выглядит следующим образом:

[{"index":[{"x":156,"y":219,"id":"#1"},{"x":183,"y":229,"id":"#2"},{"x":540,"y":131,"id":"#3"},{"x":129,"y":300,"id":"#4"}]},{"index":[{"x":175,"y":214,"id":"#1"},{"x":188,"y":206,"id":"#2"},{"x":498,"y":231,"id":"#3"},{"x":150,"y":104,"id":"#4"}]},{"index":[{"x":123,"y":327,"id":"#1"},{"x":96,"y":256,"id":"#2"},{"x":12,"y":125,"id":"#3"},{"x":27,"y":32,"id":"#4"}]},{"index":[{"x":300,"y":145,"id":"#1"},{"x":104,"y":29,"id":"#2"},{"x":54,"y":11,"id":"#3"},{"x":29,"y":16,"id":"#4"}]},{"index":[{"x":11,"y":23,"id":"#1"},{"x":214,"y":16,"id":"#2"},{"x":423,"y":211,"id":"#3"},{"x":161,"y":89,"id":"#4"}]},{"index":[{"x":6,"y":202,"id":"#1"},{"x":432,"y":62,"id":"#2"},{"x":328,"y":55,"id":"#3"},{"x":93,"y":416,"id":"#4"}]}]

Мой запрос будет выглядеть примерно так:

sort.php?set=2&x=12&y=214

Из приведенного выше примера я хотел бы вернуть / повторить разделенный запятыми список идентификаторов # * для каждого индекса набора [n] в порядке возрастания от ближайшего по сравнению с запрашиваемыми местоположениями x и y.

Я новичок в PHP и понятия не имею, с чего начать. Я надеюсь, что мой вопрос имеет смысл. Заранее спасибо!

1 Ответ

2 голосов
/ 12 декабря 2011

Предполагая, что у вас есть данные, декодированные как массив PHP в $set (как ассоциативный массив)

$sets = json_decode($json_data, true);

Затем вы просто перебираете элементы массива:

if(isset($sets[$_GET['set']])) {
    $set = $sets[$_GET['set']];
    $result = array();
    foreach($set['index'] as $entry) {
        $result[] = $entry['id']];
    }
    echo join(',', $result);
    // or echo json_encode($result);
}

Редактировать: Забыли про сортировку.Вы можете отсортировать по точкам ' Евклидово расстояние :

function d($x, $y) {
    return sqrt(pow($_GET['x'] - $x, 2) + pow($_GET['y'] - $y, 2));
}

function sort_($a, $b) {
    return d($a['x'], $a['y']) - d($b['x'], $b['y']);
}


$set = $sets[$_GET['set']]['index'];
usort($set, 'sort_');
$result = array();
foreach($set as $entry) {
    $result[] = $entry['id'];
}
echo join(',', $result);
// or echo json_encode($result);

DEMO

...