Php 找到根据距离配对位置的最佳方法
我需要能够获取位置列表,并确定最佳配对方式,以便配对中每个位置之间的距离最小Php 找到根据距离配对位置的最佳方法,php,sql,Php,Sql,我需要能够获取位置列表,并确定最佳配对方式,以便配对中每个位置之间的距离最小 我制作了一个脚本,给出了一个位置列表 创建唯一对的数组 对于每一对,它都会查询一个API,以了解这对位置之间的距离 22个位置的列表生成231对的列表 使用生成的如下列表: address1, address2, dist 我需要找出11对最好的线,它们之间的距离最小。此外,该列表必须包括所有原始22个位置,每个位置仅在列表中出现一次 **我正在寻找一个使用SQL查询、PHP或两者兼用的解决方案 提前谢谢 它非常复
我制作了一个脚本,给出了一个位置列表
address1, address2, dist
我需要找出11对最好的线,它们之间的距离最小。此外,该列表必须包括所有原始22个位置,每个位置仅在列表中出现一次
**我正在寻找一个使用SQL查询、PHP或两者兼用的解决方案
提前谢谢 它非常复杂,如果为每一行分配某种类型的Id,它会稍微简单一些。你可以考虑这样做来简化事情,但是用你所给的数据集,这是可行的。
SELECT DISTINCT TOP 11 x.*
FROM (SELECT r.address1
, MIN(r.dist) AS dist
FROM (SELECT l.address1
, l.address2
, l.dist
FROM locdist l
UNION ALL
SELECT l.address2 AS address1
, l.address1 AS address2
, l.dist
FROM locdist l
) r
GROUP BY r.address1
) y
LEFT OUTER JOIN locdist x
ON x.dist = y.dist
AND
(x.address1 = y.address1
OR
x.address2 = y.address1)
ORDER BY x.dist
你可以用你的数据试试这个,它应该会起作用 找到了答案。此解决方案首先查看最短距离,然后仅在以前未使用address1或address2的情况下输出该行
while ($row = mysql_fetch_assoc($res))
{
// Assigning variables from cell values
$address1 = $row['address1'];
$address2 = $row['address2'];
if(in_array($address1, $minDistance) OR in_array($address2, $minDistance)) {
} else {
$minDistance[] = $address1;
$minDistance[] = $address2;
echo $row['address1'] . '|' . $row['address2'] . '|' . $row['distance'] . '<br>';
}
}
while($row=mysql\u fetch\u assoc($res))
{
//从单元格值分配变量
$address1=$row['address1'];
$address2=$row['address2'];
if(在_数组中($address1,$MindDistance)或在_数组中($address2,$MindDistance)){
}否则{
$minDistance[]=$address1;
$minDistance[]=$address2;
回显$row['address1'].|'.$row['address2'.|'.$row['distance'.];
}
}
对不起,我在第一次发布后才意识到它没有完全按照您的要求执行。我相信这个版本应该可以做到这一点。这个解决方案几乎可以工作,但它并不限制一个位置出现在多对中。每个位置都必须成对使用,一旦一个位置成对使用,就不能再使用了。啊,是的,我想它没有完全按照你的要求做,是吗。。。嗯,我不确定我将如何解决这个问题,看起来你已经有了解决方案,所以我想我不会担心。你能补充更多细节吗?不清楚您是想从内存中的PHP数组中查找这些对,还是将它们存储在DB中(带有API响应)。表结构也会有帮助。您可以按自己的方式限制行数
while ($row = mysql_fetch_assoc($res))
{
// Assigning variables from cell values
$address1 = $row['address1'];
$address2 = $row['address2'];
if(in_array($address1, $minDistance) OR in_array($address2, $minDistance)) {
} else {
$minDistance[] = $address1;
$minDistance[] = $address2;
echo $row['address1'] . '|' . $row['address2'] . '|' . $row['distance'] . '<br>';
}
}