我在一个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查询中进行此类排序吗?)
答案 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发布的数字,并查看游戏中的结果,看起来所有内容都已正确排序。找到最短的路径。