【问题标题】:php category, sub category treephp分类,子分类树
【发布时间】:2014-04-19 15:07:26
【问题描述】:

我以前在很长的复杂语句中做过这个,但我正在尝试清理一些代码。

我有以下表结构

parent_categories            child_categories
-------------------          ----------------------
|pid|category_name|          |ID|category_name|lpid|
| 01| Parent cat 1|          |01|subcategory 1| 01 |
| 02| Parent cat 2|          |02|subcategory 2| 01 |
-------------------          |03|subcategory 3| 02 |
                             ----------------------

我正在尝试回显 sql 结果,以便它们采用以下格式:

Parent Cat 1
    subcategory 1
    subcategory 2
Parent cat 2
    subcategory 3

这是我正在使用的代码,但它让位于许多结果,我仍然对循环感到非常困惑。

$get_categories = "SELECT * FROM
                                parent_categories a
                            INNER JOIN
                                child_categories b
                                ON a.pid = b.lpid";

$q_get= $conn->prepare($get_categories);
$q_get->execute();
    while ($rowCategories= $q_get->fetch())
    {
        echo $rowCategories['parent_name']."<br/>";
            foreach ($rowCategories as $parent)
                {
                    echo $parent."<Br?>";
                    echo $rowCategories['category_name']. "<Br/>";
                }

    }   

谢谢

【问题讨论】:

  • 你想要输出什么?

标签: php mysql


【解决方案1】:
$qry = $conn->prepare('
  SELECT   a.pid, a.parent_name, b.category_name
  FROM     parent_categories a
      JOIN child_categories  b ON a.pid = b.lpid
  ORDER BY a.pid
');

if ($qry->execute()) {
  echo '<ul>';

  $row = $qry->fetch();
  while ($row) {
    $current_pid = $row['pid'];

    echo '<li>', htmlentities($row['parent_name']), '<ul>';
    do {
      echo '<li>', htmlentities($row['category_name']), '</li>';
    } while ($row = $qry->fetch() and $row['pid'] == $current_pid);
    echo '</ul></li>';
  }

  echo '</ul>';
}

【讨论】:

    【解决方案2】:

    你需要调整你的循环,foreach循环没有用,只是玩if else来检查父类是否相同,查询结果将在每一行中都有父类的名称,

    $get_categories = "SELECT * 
     FROM parent_categories a
      INNER JOIN  child_categories b ON a.pid = b.lpid
     ORDER BY a.pid";
    
    $currentParent = false;
    while ($rowCategories = $q_get->fetch())
    {
    if ($currentParent != $rowCategories['pid'])
    {
    echo '<h1>'.htmlentities($rowCategories['parent_name']).'</h1>';
    $currentParent = $rowCategories['pid'];
    }
    
    echo '<p>' . htmlentities($rowCategories['category_name']) . '</p>';
    
    }
    

    上面的代码会像

    一样输出
    <h1>Parent Cat 1</h1>
        <p>subcategory 1</p>
        <p>subcategory 2</p>
    <h1>Parent cat 2</h1>
        <p> subcategory 3</p>
    

    编辑@eggyal的cmets对答案有一些更正

    【讨论】:

    • 一些观察。 (1) 注意按父类别对结果集进行排序; (2) 注意不同的parent_categories 可能有相同的parent_name,所以你应该真正跟踪/比较pid; (3) 请注意,您正在跟踪的值可能评估为false,因此可能不会输出初始父值; (4) 注意为 HTML 转义输出。
    • @eggyal 我明白了你的观点 1 和 2 真的意味着感谢您的更正
    【解决方案3】:

    INNER JOIN 的结果是:

    Parent Cat 1 subcategory 1
    Parent Cat 1 subcategory 2
    Parent Cat 2 subcategory 3
    

    如果要将它们格式化为数组中的数组,请使用 php

    【讨论】:

      猜你喜欢
      • 2020-02-03
      • 1970-01-01
      • 2013-06-09
      • 2016-02-23
      • 2014-01-10
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      相关资源
      最近更新 更多