按X / Y位置排序,按最近的项目排序

时间:2015-03-02 12:17:52

标签: sqlite sorting path-finding

我在一个SQLite数据库中得到了一个项目列表(450),在地图上有X / Y位置 (看起来像https://imagizer.imageshack.us/v2/991x240q90/912/VIkE4j.png

地图是扁平的,看起来像http://imagizer.imageshack.us/a/img537/1814/bUoiKP.jpg

我想按X / Y位置对此列表进行排序,因此下一项是距离上一项最近的1。

我怎么能像这样对它们进行排序?

(也很高兴知道,但并不重要:我可以单独在SQLite查询中进行此类排序吗?)

1 个答案:

答案 0 :(得分:0)

这似乎奏效了。 https://github.com/divinity76/onlinkshit/commit/15d24a48c73ea4a9298805bbfa3a6aa2d80e2460  有人看错了吗?

    function sort_by_xy_distance($input_list)
    {
        $ret = array();
        $a = $input_list[0];
        array_push($ret, $input_list[0]);
        $input_list[0] = null;
        $i = 1;
        for ($i = 1; $i < count($input_list); ++$i) {
//            if ($input_list[$i] == null) {
//                echo 'already added to list..';
//                continue;
//           }
            $ii = 1;
            $tmpdistance = 0;
            $nearest = array(
                'index' => -1,
                'distance' => PHP_INT_MAX
            );
            for ($ii = 1; $ii < count($input_list); ++$ii) {
                if ($input_list[$ii] == null || $ii == $i) {
                    //echo 'already added to list..';
                    continue;
                }
                $tmpdistance = abs($input_list[$ii]['x'] - $a['x']) + abs($input_list[$ii]['y'] - $a['y']);
                if ($tmpdistance < $nearest['distance']) {
                    $nearest['index'] = $ii;
                    $nearest['distance'] = $tmpdistance;
                }
            }
            assert($nearest['index'] != -1);
            array_push($ret, $input_list[$nearest['index']]);
            $a = $input_list[$nearest['index']];
            $input_list[$nearest['index']] = null;
        }
        return $ret;
    }

这里是完全复制&amp;使用真实数据粘贴可运行的测试代码:

http://pastebin.com/raw.php?i=ST3saHj2(太大了,不能发布有30000个字符/帖子限制的stackoverflow)

查看php发布的数字,并查看游戏中的结果,看起来所有内容都已正确排序。找到最短的路径。