【问题标题】:Sort a JSON-Encoded List of X and Y Coordinates using PHP使用 PHP 对 X 和 Y 坐标的 JSON 编码列表进行排序
【发布时间】:2011-12-12 09:10:21
【问题描述】:

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

从上面的示例中,我想为 set[n] 的每个索引按升序返回/回显一个逗号分隔的 id# 列表与查询的 x 和 y 位置相比,从最近到最远。

我是 PHP 新手,不知道从哪里开始。我希望我的问题是有道理的。提前致谢!

【问题讨论】:

    标签: php arrays json sorting


    【解决方案1】:

    假设您将$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);
    }
    

    编辑:忘记排序了。你可以按分数排序'Euclidean distance:

    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

    【讨论】:

    • 我不是故意冒昧,但你的意思是: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']); } usort(set, 'sort_');
    • 哦,抱歉最近 JavaScript 太多了;)我更正了距离函数,它完全搞砸了。
    • 我无法使代码工作。该列表重新排序,但不与 $_GET[] 的输入值进行比较。此外,列表似乎没有正确排序 - 即最接近最远点。
    • Felix:首先,感谢您的帮助!那就是说;我在输出中遇到了一些奇怪的不一致。我已经逐字获取了您给我的代码示例,并在网格上以图形方式绘制了输出。具有讽刺意味的是,唯一正确排序的是设置 2。以下是我正在谈论的一些屏幕截图:set5set4set3set1
    • 我很抱歉,这是我的一个巨大错误。你对d($a['x'], $a['y']) - d($b['x'], $b['y']);的评论是正确的。我只是很困惑将哪些参数传递给哪个函数....我更新了代码和演示,它现在真的应该可以工作了。对不起:-/
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 2011-10-23
    • 2014-12-31
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多