【问题标题】:Converting Array data to <ul> <li> width PHP将数组数据转换为 <ul> <li> 宽度 PHP
【发布时间】:2012-09-08 16:42:51
【问题描述】:

在 MySQL 中,我的表如下所示:

在 MySQL 中,我的表如下所示:

http://sqlfiddle.com/#!2/76717.

CREATE TABLE IF NOT EXISTS `tbl_category` (
  `id` int(6) NOT NULL auto_increment,
  `parent_id` int(4) NOT NULL default '0',
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


INSERT INTO `tbl_category` (`id`, `parent_id`, `name`) VALUES
(1, 0, 'Category 1'),
(2, 0, 'Category 2'),
(3, 0, 'Category 3'),
(4, 1, 'Category 1. 1'),
(5, 1, 'Category 1. 2'),
(6, 1, 'Category 1. 3'),
(7, 4, 'Category 1. 1. 1'),
(8, 4, 'Category 1. 1. 2'),
(9, 4, 'Category 1. 1. 3');

我的数组

我的数组

$arrCategories = array(
    array("id" => 1, "parent_id" => 0, "name" => "Category 1", "children" => array()
                array("id" => 4, "parent_id" => 1, "name" => "Category 1. 1", "children" => array()
                         array("id" => 7, "parent_id" => 4, "name" => "Category 1. 1. 1", "children" => array()),
                         array("id" => 8, "parent_id" => 4, "name" => "Category 1. 1. 2", "children" => array()),
                         array("id" => 9, "parent_id" => 4, "name" => "Category 1. 1. 3", "children" => array())
                                ),
                array("id" => 5, "parent_id" => 1, "name" => "Category 1. 2", "children" => array()),
                array("id" => 6, "parent_id" => 1, "name" => "Category 1. 3", "children" => array())        
        ),
    array("id" => 2, "parent_id" => 0, "name" => "Category 2", "children" => array()),
    array("id" => 3, "parent_id" => 0, "name" => "Category 3", "children" => array())
);

数组输出

数组输出

Array
(
    [id] => 1
    [parent_id] => 0
    [name] => Category 1
    [children] => Array
        (
            [4] => Array
                (
                    [id] => 4
                    [parent_id] => 1
                    [name] => Category 1. 1
                    [children] => Array
                        (
                            [7] => Array
                                (
                                    [id] => 7
                                    [parent_id] => 4
                                    [name] => Category 1. 1. 1
                                    [children] => Array
                                        (
                                        )

                                )

                            [8] => Array
                                (
                                    [id] => 8
                                    [parent_id] => 4
                                    [name] => Category 1. 1. 2
                                    [children] => Array
                                        (
                                        )

                                )

                            [9] => Array
                                (
                                    [id] => 9
                                    [parent_id] => 4
                                    [name] => Category 1. 1. 3
                                    [children] => Array
                                        (
                                        )

                                )

                        )

                )

            [5] => Array
                (
                    [id] => 5
                    [parent_id] => 1
                    [name] => Category 1. 2
                    [children] => Array
                        (
                        )

                )

            [6] => Array
                (
                    [id] => 6
                    [parent_id] => 1
                    [name] => Category 1. 3
                    [children] => Array
                        (
                        )

                )

        )

)
Array
(
    [id] => 2
    [parent_id] => 0
    [name] => Category 2
    [children] => Array
        (
        )

)
Array
(
    [id] => 3
    [parent_id] => 0
    [name] => Category 3
    [children] => Array
        (
        )

)

我如何使它宽度 PHP ?

我如何使它宽度 PHP ?

<ul>
 <li>Category 1
  <ul>
   <li>Category 1. 1
    <ul>
     <li>Category 1. 1. 1</li>
     <li>Category 1. 1. 2</li>
     <li>Category 1. 1. 3</li>
    </ul>
   </li>
   <li>Category 1. 2</li>
   <li>Category 1. 3</li>
  </ul>
 </li>
 <li>Category 2</li>
 <li>Category 3</li>
</ul>

这不能正常工作

这不能正常工作

<?php
echo "    <ul>\n";
foreach ($categories as $category) {
echo "     <li>".$category['ad'];

if ($category['children']) {
echo "      <ul>\n";
foreach ($category['children'] as $child) {
echo "       <li>".$child['ad']."</li>\n";
}
echo "      </ul>\n";
}
echo "     </li>\n";
}
echo "    </ul>\n";
?>

感谢现在对我有用,这就是功能...... http://ideone.com/u2GNV

但我认为无效的 ul 和 li 标签...

http://ideone.com/u2GNV 我的结果

<ul>
 <li>Category 1
  <ul>
   <li>Category 1. 1
    <ul>
     <li>Category 1. 1. 1</li>
    </ul>
    <ul>
     <li>Category 1. 1. 2</li>
    </ul>
    <ul>
     <li>Category 1. 1. 3</li>
    </ul>
   </li>
  </ul>

  <ul>
   <li>Category 1. 2</li>
  </ul>

  <ul>
   <li>Category  1. 3</li>
  </ul>
 </li>
</ul>

<ul>
 <li>Category 2</li>
</ul>

<ul>
 <li>Category 3</li>
</ul>

我认为有效的 w3 代码

<ul>
 <li>Category 1
  <ul>
   <li>Category 1. 1
    <ul>
     <li>Category 1. 1. 1</li>
     <li>Category 1. 1. 2</li>
     <li>Category 1. 1. 3</li>
    </ul>
   </li>
   <li>Category 1. 2</li>
   <li>Category 1. 3</li>
  </ul>
 </li>
 <li>Category 2</li>
 <li>Category 3</li>
</ul>

【问题讨论】:

    标签: php recursion multidimensional-array categories hierarchical-data


    【解决方案1】:

    您可以创建一个函数来将所有数组解析为 menu like 块并使用递归:

    对于那个数组:

    function printMenu($array){
        foreach($array as $item){
            if(is_array($item) && isset($item['name'])){
                echo "<ul>\n";
    
                    if(is_array($item['children'])){
                        echo "<li>".$item['name'];
                        printMenu($item);
                        echo "</li>\n";
                    } else {
                        echo "<li>".$item['name']."</li>\n";
                    }
    
                echo "</ul>\n\n";
            }
        }
    }
    

    来自 mysql 资源(基于您的表):

    $db = new PDO('mysql:host=localhost;dbname=test', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    
    
    function printMenu($array){
        foreach($array as $item){
            if(is_array($item) && isset($item['name'])){
                echo "<ul>\n";
                    if(getChildren($item['id'], false)){
                        echo "<li>".$item['name'];
                        printMenu(getChildren($item['id'], true));
                        echo "</li>\n";
                    } else {
                        echo "<li>".$item['name']."</li>\n";
                    }
    
                echo "</ul>\n\n";
            }
        }
    }
    
    function getChildren($id, $return = false){
        global $db;
        $stmt = $db->prepare("SELECT * FROM `tbl_category` WHERE `parent_id` = :parent_id");
        $stmt->execute(array(':parent_id' => $id));
        $num = $stmt->rowCount();
        if($num){
            if($return){
                $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
                return $row;
            }
            return true;
        }
        return false;
    }
    
    
    $query = "SELECT * FROM `tbl_category` WHERE `parent_id` = 0";
    $stmt = $db->query($query);
    $row = $stmt->fetchAll(PDO::FETCH_ASSOC);
    printMenu($row);
    

    结果:

    • 类别 1
      • 类别 1.1
        • 类别 1.1.1
        • 类别 1.1.2
        • 类别 1.1.3
      • 1.2类
      • 1.3类
    • 2 类
    • 第 3 类

    【讨论】:

    • 非常感谢。如何写出这个结果的$arrCategories 数组函数?
    • 什么意思怎么写?你刚写的?如何将其从数据库中提取出来?
    • 是的 @Mihai Iorga 数据库到数组 $arrCategories 对不起我的英语很糟糕我认为我的数组输出函数不起作用而且很长
    • 请看我的函数和你的函数结果http://ideone.com/MguhQ
    • 我无法添加你的函数,因为你没有使用来自数据库的递归,这个脚本工作正常,mysql_* 函数已被弃用,尝试更改为 PDO
    猜你喜欢
    • 2013-05-26
    • 2023-04-02
    • 1970-01-01
    • 2018-11-30
    • 2023-03-21
    • 1970-01-01
    • 2011-03-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多