两个表的位置和路线。位置表包含以下字段和值
id | name
1 | bangalore
2 | mumbai
3 | kolkatta
4 | delhi
路线表包含以下字段和值
id | source | desination
1 | 1 | 4
2 | 1 | 2
3 | 1 | 3
4 | 2 | 4
5 | 2 | 3
6 | 3 | 4
想要找到所有从源到目的地的可能路线,例如
bangalore-delhi
bangalore-mumbai-delhi
bangalore-mumbai-kolkatta-delhi
bangalore-kolkatta-delhi
请帮助我达到这个结果
最佳答案
使用两个表中的现有数据,您可以在LEFT JOIN
列中添加来自Routes的源和目的地,这意味着您的INT
值将与Location.name列匹配。然后确保按源列对数据进行排序,以便以后使用PHP进行排序更容易。
MySQL:
SELECT locStart.name as start, locFinish.name as finish FROM `routes`
LEFT JOIN location as locStart
ON routes.source = locStart.id
LEFT JOIN location as locFinish
ON routes.destination = locFinish.id
ORDER BY routes.source
输出:
array (
0 =>
array (
'start' => ' bangalore',
'finish' => 'delhi',
),
1 =>
array (
'start' => ' bangalore',
'finish' => 'mumbai',
),
2 =>
array (
'start' => ' bangalore',
'finish' => 'kolkatta',
),
//Etc....
然后,使用Source名称作为键,将数据库结果添加到多维数组中。
$stmt = $pdo->query($query);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$newArr;
foreach ($result as $v) {
$newArr[$v['start']][] = $v['finish'];
}
输出:
array (
' bangalore' =>
array (
0 => 'delhi',
1 => 'mumbai',
2 => 'kolkatta',
),
'mumbai' =>
array (
0 => 'delhi',
1 => 'kolkatta',
),
'kolkatta' =>
array (
0 => 'delhi',
),
)
为了输出新数组,可以使用递归函数:
function recurse($newArr, $key=NULL) {
if($key !== NULL) {
foreach ($newArr[$key] as $k=>$v) {
echo '<li>Destination: ' . $v . '</li>';
}
echo '</ul>';
} else {
foreach ($newArr as $k=>$v) {
echo 'Source: ' . $k . '<br><ul>';
recurse($newArr, $k);
}
}
}
输出:
资料来源:班加罗尔
目的地:德里
目的地:孟买
目的地:kolkatta
资料来源:孟买
目的地:德里
目的地:kolkatta
资料来源:kolkatta
目的地:德里