如何在php中创建父子关系

如何在php中创建父子关系,php,mysql,Php,Mysql,两个表位置和路线。位置表包含以下字段和值 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 Routes表包含以下字段和值 id | name 1 | bangalore 2 | mumbai 3

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

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
Routes表包含以下字段和值

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

请帮助我实现此结果

使用两个表中的现有数据,您可以从路由左连接
列源和目标,这意味着您的
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....
输出:

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....
然后使用源名称作为键将DB结果添加到多维数组中

$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);
        }   
    } 
}
函数递归($newArr,$key=NULL){ 如果($key!==NULL){ foreach($newArr[$key]作为$k=>$v){ 回显“
  • 目的地:”.$v.
  • ”; } 回声“”; }否则{ foreach($newArr为$k=>$v){ 回声“来源:”.$k.“
      ”; 递归($newArr,$k); } } }
    输出:

    array (
      ' bangalore' => 
      array (
        0 => 'delhi',
        1 => 'mumbai',
        2 => 'kolkatta',
      ),
      'mumbai' => 
      array (
        0 => 'delhi',
        1 => 'kolkatta',
      ),
      'kolkatta' => 
      array (
        0 => 'delhi',
      ),
    )
    
    资料来源:班加罗尔

    • 目的地:德里
    • 目的地:孟买
    • 目的地:加尔各答
    资料来源:孟买

    • 目的地:德里
    • 目的地:加尔各答
    资料来源:加尔各答

    • 目的地:德里

    首先,将您的列“from”&“to”重命名为其他内容,因为它是一个保留的MySQL关键字。可能是这样的吗?这很容易变成旅行推销员的问题: