排序一个json编码列表的X和Y坐标使用PHP


Sort a JSON-Encoded List of X and Y Coordinates using PHP

使用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

从上面的例子中,我想返回/回显id#'s的逗号分隔的列表对于集合[n]的每个索引,与查询的x和y位置相比,从最近到最远按升序排列。

我是一个PHP新手,不知道从哪里开始。我希望我的问题有意义。提前感谢!

假设您已将数据解码为$set中的PHP数组(作为关联数组)

$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);
}

Edit:忘记排序了。你可以按点的欧氏距离排序:

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);