简体   繁体   English

多级数组到一个表

[英]Multi-level array to a table

I am trying to convert a multi-level array to a table. 我正在尝试将多级数组转换为表。 However my code does not output what I want. 但是我的代码没有输出我想要的。 It shows the last child, but not other child and grandchild. 它显示了最后一个孩子,但没有其他孩子和孙子。

DB table 数据库表

CREATE TABLE IF NOT EXISTS `menus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `shortdesc` varchar(255) NOT NULL,
  `status` enum('active','inactive') NOT NULL,
  `parentid` int(11) NOT NULL,
  `order` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=71 ;

--
-- Dumping data for table `menus`
--

INSERT INTO `menus` (`id`, `name`, `shortdesc`, `status`, `parentid`, `order`) VALUES
(24, 'Main menu', 'mainmenu', 'active', 0, 0),
(25, 'Galleri 1', 'galleri1', 'active', 0, 0),
(69, 'Main 2-2', '', 'active', 62, 0),
(68, 'Main 2-1', '', 'active', 62, 0),
(65, 'Main 4', '', 'active', 24, 0),
(64, 'Main 3', '', 'active', 24, 0),
(67, 'Main 1-2', '', 'active', 59, 0),
(62, 'Main 2', '', 'active', 24, 0),
(59, 'Main 1', '', 'active', 24, 0),
(66, 'Main 1-1', '', 'active', 59, 0),
(70, 'Manu 4-1', '', 'active', 65, 0);

View 视图

if (count($navlist)){
  echo "<table border='1' cellspacing='0' cellpadding='3' width='800'>\n";
    echo "<thead>\n<tr valign='top'>\n";
    echo "<th>ID</th>\n<th>Name</th><th>Status</th><th>parentid</th><th>Actions</th>\n";
    echo "</tr>\n</thead>\n<tbody>\n";
        foreach ($navlist as $key => $menu){
        echo "<tr valign='top'>\n";
        echo "<td>".$menu['id']."</td>\n";
        echo '<td><a href="'. site_url(). '/admin/menus/submenus/' . $menu['id'] . '">' .$menu['name']."</a></td>\n";
        echo "<td align='center'>".$menu['status']."</td>\n";
        echo "<td align='center'>".$menu['parentid']."</td>\n";
        echo "<td align='center'>";
        echo anchor('admin/menus/editMenu/'.$menu['id'],'edit');
        echo " | ";
        echo anchor('admin/menus/deleteMenu/'.$menu['id'],'delete', array('class' => 'delete_link'));
        echo "</td>\n";
        echo "</tr>\n";
        if (count($menu['children'])){

        foreach ($menu['children'] as $subkey => $submenu){
        echo "<tr class='child' valign='top'>\n";
        echo "<td>".$submenu['id']."</td>\n";
        echo '<td><a href="'. site_url(). '/admin/menus/submenus/' . $submenu['id'] . '">' .$submenu['name']."</a></td>\n";
        echo "<td align='center'>".$submenu['status']."</td>\n";
        echo "<td align='center'>".$submenu['parentid']."</td>\n";
        echo "<td align='center'>";
        echo anchor('admin/menus/editMenu/'.$submenu['id'],'edit');
        echo " | ";
        echo anchor('admin/menus/deleteMenu/'.$submenu['id'],'delete', array('class' => 'delete_link'));
        echo "</td>\n";
        echo "</tr>\n";
        }
        if (count($submenu['children'])){
        foreach ($submenu['children'] as $subkey => $subsubname){
        echo "<tr class='grandchild' valign='top'>\n";
        echo "<td>". $subsubname['id']."</td>\n";
        echo '<td><a href="'. site_url(). '/admin/menus/submenus/' .  $subsubname['id'] . '">' . $subsubname['name']."</a></td>\n";
        echo "<td align='center'>". $subsubname['status']."</td>\n";
        echo "<td align='center'>". $subsubname['parentid']."</td>\n";
        echo "<td align='center'>";
        echo anchor('admin/menus/editMenu/'. $subsubname['id'],'edit');
        echo " | ";
        echo anchor('admin/menus/deleteMenu/'. $subsubname['id'],'delete', array('class' => 'delete_link'));
        echo "</td>\n";
        echo "</tr>\n";
        }
        }
        }
        }
        echo "</tbody>\n</table>";
        }

HTML Output HTML输出

<table border='1' cellspacing='0' cellpadding='3' width='800'>
<thead>
<tr valign='top'>
<th>ID</th>
<th>Name</th><th>Status</th><th>parentid</th><th>Actions</th>
</tr>
</thead>
<tbody>
<tr valign='top'>

<td>24</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/24">Main menu</a></td>
<td align='center'>active</td>
<td align='center'>0</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/24">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/24" class="delete_link">delete</a></td>
</tr>
<tr class='child' valign='top'>
<td>65</td>

<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/65">Main 4</a></td>
<td align='center'>active</td>
<td align='center'>24</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/65">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/65" class="delete_link">delete</a></td>
</tr>
<tr class='child' valign='top'>
<td>64</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/64">Main 3</a></td>

<td align='center'>active</td>
<td align='center'>24</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/64">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/64" class="delete_link">delete</a></td>
</tr>
<tr class='child' valign='top'>
<td>62</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/62">Main 2</a></td>
<td align='center'>active</td>

<td align='center'>24</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/62">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/62" class="delete_link">delete</a></td>
</tr>
<tr class='child' valign='top'>
<td>59</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/59">Main 1</a></td>
<td align='center'>active</td>
<td align='center'>24</td>

<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/59">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/59" class="delete_link">delete</a></td>
</tr>
<tr class='grandchild' valign='top'>
<td>67</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/67">Main 1-2</a></td>
<td align='center'>active</td>
<td align='center'>59</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/67">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/67" class="delete_link">delete</a></td>

</tr>
<tr class='grandchild' valign='top'>
<td>66</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/66">Main 1-1</a></td>
<td align='center'>active</td>
<td align='center'>59</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/66">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/66" class="delete_link">delete</a></td>
</tr>
<tr valign='top'>

<td>25</td>
<td><a href="http://127.0.0.1/ci/index.php/admin/menus/submenus/25">Galleri 1</a></td>
<td align='center'>active</td>
<td align='center'>0</td>
<td align='center'><a href="http://127.0.0.1/ci/index.php/admin/menus/editMenu/25">edit</a> | <a href="http://127.0.0.1/ci/index.php/admin/menus/deleteMenu/25" class="delete_link">delete</a></td>
</tr>
</tbody>
</table>

This solution involves recursion. 此解决方案涉及递归。 If you are not familiar with the term or have a hard time following along, please refer to this IBM entry entitled " Mastering recursive programming " to familiarize yourself. 如果您不熟悉该术语或者很难理解,请参阅此IBM条目,标题为“ 掌握递归编程 ”,以熟悉一下自己。 It seems as though you only plan on having three levels of navigation. 似乎您只打算进行三个级别的导航。 With that being said, this code only handles the classnames parent/child/grandchild for those three levels. 话虽如此,该代码仅处理这三个级别的父/子/孙子类名。 You can easily add more by adding new array entries to $depthClassMapping . 您可以通过向$depthClassMapping添加新的数组条目来轻松添加更多$depthClassMapping

/**
 * @param array $level The current navigation level array
 * @param string $output The output to be added to
 * @param int $depth The current depth of the tree to determine classname
 */
function generateRowsByLevel($level, &$output, $depth = 0) {

    $depthClassMapping = array(0 => 'parent', 1 => 'child', 2 => 'grandchild');

    foreach ($level as $row) {
        $output .= "<tr class=\"" . $depthClassMapping[$depth] . "\" valign='top'>\n";
        $output .= "<td>". $row['id']."</td>\n";
        $output .= '<td><a href="'. site_url(). '/admin/menus/submenus/' .  $row['id'] . '">' . $row['name']."</a></td>\n";
        $output .= "<td align='center'>". $row['status']."</td>\n";
        $output .= "<td align='center'>". $row['parentid']."</td>\n";
        $output .= "<td align='center'>";
        $output .= anchor('admin/menus/editMenu/'. $row['id'],'edit');
        $output .= " | ";
        $output .= anchor('admin/menus/deleteMenu/'. $row['id'],'delete', array('class' => 'delete_link'));
        $output .= "</td>\n";
        $output .= "</tr>\n";

        // if the row has any children, parse those to ensure we have a properly 
        // displayed nested table
        if (!empty($row['children'])) {
            generateRowsByLevel($row['children'], $output, $depth + 1);
        }
    }
}

//==================
// RUN THE GENERATOR 
//==================
if (count($navlist)){

    // begin table
    $output = "<table border='1' cellspacing='0' cellpadding='3' width='800'>\n";
    $output .= "<thead>\n<tr valign='top'>\n";
    $output .= "<th>ID</th>\n<th>Name</th><th>Status</th><th>parentid</th><th>Actions</th>\n";
    $output .= "</tr>\n</thead>\n<tbody>\n";

    // generate all table rows
    generateRowsByLevel($navlist, $output);

    // close up the table
    $output .= "</tbody>\n</table>";

    // display table
    echo $output;
}

您需要实现一个递归函数,或者使用带有回调函数的array_map之类的函数来处理多数组,同时发送回适当的数据,您可以在php.net站点上查看有关该函数的更多信息。

Your logic is too flat and flawed. 您的逻辑过于平坦和有缺陷。 Make use of functions and recursion. 利用函数和递归。 You may find this blog useful as well: http://crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html 您可能还会发现此博客也很有用: http : //crisp.tweakblogs.net/blog/317/formatting-a-multi-level-menu-using-only-one-query.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM