【问题标题】:how to short this PHP code?如何缩短这个 PHP 代码?
【发布时间】:2015-07-15 20:49:04
【问题描述】:

我有三张桌子

id1 title1         id2 title2       id3 title3
1    ....          1    ....        1   .....
2     .....        2    .....       2    ....
3     ...          3   .....        3    ....
4    .....                          4    .... 
                                    5   ..... 

假设每个 title1 都有一些 title2 并且每个 title2 内部都有一些 title3。我想要上面的输出

title1
  title2
    title3
    title3
  title2
    title3
  title2
    title3
    title3
    title3
------------
title1
  title2
    title3
  title2
    title3
    title3
    .
    .
    .
    .

虽然我能够创建这个 (我使用 JOIN)。我正在使用三个$command = mysqli.. 和三个while loops。就像

$command = mysqli...
while($row = mysqli_fetch_array($command)){
  echo ..

  $command2 = mysqli...
  while($row2 = mysqli_fetch_array($command2)){
     echo ..

     $command3 = mysqli...
     while($row3 = mysqli_fetch_array($command3)){
        echo ..

     }
  }
} 

其他人评论了我的代码并说“有什么办法不使用三个 while 循环”或“你为什么要三次调用你的数据库?”

你能做到吗? 有什么方法可以让一个 mysqli_query() 获得有意图的输出?

【问题讨论】:

  • 你对标题的看法是对的,而不是关于清晰性的看法
  • @hellcode 我有 3 个连接表,用于连接语句。我没有在这里展示它们,因为我认为您可以创建一个 JOIN 表。我的意思是这个问题。如何为一个 query() 创建一个 JOIN 表?
  • @hellcode 我的英语不好。我想维基百科有标题,每个标题都有其他子标题。发生了什么?
  • 已经回答了

标签: php while-loop inner-join


【解决方案1】:

让我们将表连接在一起:

SELECT t1.id id1, t1.title tit1, t2.id id2, t2.title tit2, t3.id id3, t3.title tit3 FROM table1 t1 JOIN table2 t2 ON t1.id =t2.pid JOIN table3 t3 ON t2.id =t3.pid ORDER BY id1, id2, id3;

在 PHP 中:

$tt1 = -1;
$tt2 = -1; 
$tt3 = -1;
while($row = mysqli_fetch_array($command)){
if($row['id1'] != $tt1){
$tt1 = $row['id1'];
echo ( $row['tit1'];
}
if($row['id2'] != $tt2){
$tt2 = $row['id2'];
echo ( $row['tit2'];
}
if($row['id3'] != $tt3){
$tt3 = $row['id3'];
echo ( $row['tit3'];
}
} 

我不测试它,因为我是通过手机发帖的。我认为它应该有效。

【讨论】:

    【解决方案2】:

    假设您的每个表都有一个将其链接到其父表的键列,您应该能够在一个查询中将它们全部连接在一起。

    $sql = "SELECT id1, title1, id2, title2, id3, title3 
            FROM table1
            LEFT JOIN table2 ON table1.id1 = table2.id1
            LEFT JOIN table3 ON table2.id2 = table3.id2
            ORDER BY id1, id2, id3";
    $command = mysqli_query($sql);
    

    我不确定外键列的名称,但这应该足以让您了解我的意思。

    然后您可以在获取查询结果时构造一个多维数组。

    $tree = array();   
    while ($row = mysli_fetch_object($command)) {
        $tree[$row->id1]['title'] = $row->title1;
        $tree[$row->id1]['subtitles'][$row->id2]['title'] = $row->title2;
        $tree[$row->id1]['subtitles'][$row->id2]['subtitles'][] = $row->title3;
    }
    

    拥有该数组后,您可以选择多种方式对其进行格式化。例如,这是一个嵌套列表。

    echo '<ul>';
    foreach($tree as $title1) {
        echo '<li>' . $title1['title'] . '<ul>';
        foreach ($title1['subtitles'] as $title2) {
            echo '<li>' . $title2['title'] . '<ul><li>';
            echo implode('</li><li>', $title2['subtitles']);
            echo '</li></ul></li>';
        }
        echo '</ul></li>';
    }
    echo '</ul>';
    

    您可以从这些结构的重复中看出,如果您添加更多级别,则使用递归函数来生成输出会更有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-04
      • 2016-02-16
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多