两个表的位置和路线。位置表包含以下字段和值

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


目的地:德里

10-04 21:40