PHP - 我如何为每个表做一个数组?

时间:2014-04-07 20:59:28

标签: php arrays

我知道这是一个非常棒的问题,但我现在正在学习如何使用数组,我想知道如何将两个表放在不同的数组中,并将它们结合起来。

我正在建立一个菜单,这个菜单有子菜单,我创建了两个表,一个用于菜单,另一个用于子菜单,我想要两者结合,我会做这样的事情:< / p>

<ul>
<li>Menu</li>
<ul>
<li>Submenu</li>
</ul>
</ul>

所以,我有我的功能和查询

function addjo(){
global $name, $ii, $array;


    addjoview($name, $ii, $array);
}

    $query= ("select * from menu inner join submenu on menu.menu_id=submenu.menu_id");
    $array = db_array($query, 'a+');
    $ii   = count($array);

我在这里调用此功能

 <?php
 function  addjoview($name, $ii, $array){

               for ($i = 0; $i < $ii; $i++) {
               $id = $array[$i]['menu_id'];
               $submenu_url  = $array[$i]['submenu_url'];
               $menu_id  = $array[$i]['menu_id'];


            echo $menu_id;

            echo '<br>';
               }



         }
           ?>

3 个答案:

答案 0 :(得分:0)

最简单的是单个数组:

SELECT menu.id, menu.name, submenu.id, submenu.name
FROM menu
LEFT JOIN submenu on menu.menu_id=submenu.menu_id

然后

$menu = array();
while(list($mid, $mname, $sid, $sname) = mysql_fetch_assoc($result)) {
     if (!isset($menu[$mid])) {
          $menu[$mid] = array('name' => $mname, 'sub' => array());
     }
     $menu[$mid]['sub'][$sid] = array('name' => $sname);
}

这会给你类似的东西:

Array (
   1 => array(
        'name' => 'parent menu item #1',
        'sub' => array(
           1 => 'first submenu',
           2 => 'second submenu'
           ...
        )),
   2 => array(
        'name' => ' parent second item',
        'sub' => array(
            1 => 'item in submenu #2'
     etc...

答案 1 :(得分:0)

我猜你真正需要做的是将菜单/子菜单数据读入二维数组。为此,让我们从您的查询开始。目前,您没有在select语句中执行任何排序。你还没有共享你的表结构,所以我假设你有这样的东西:

菜单表:

menu_id
menu_label
menu_order

子菜单表

submenu_id
menu_id
submenu_label
submenu_url
submenu_order

现在,让我们写一个有用的查询:

SELECT
    m.menu_label AS menu_label,
    s.submenu_label AS submenu_label,
    s.submenu_url AS submenu_url
FROM menu AS m
INNER JOIN submenu AS s
    ON m.menu_id = s.menu_id
ORDER BY m.menu_order ASC, s.submenu_order ASC

现在让我们看看如何处理这些数据:

$menu_array = array();
while ($row = /* your DB row fetch here */) {
    $array[$row['menu_label']][] = array(
       'label' => $row['submenu_label'],
       'url' => $row['submenu_url']
    );
}

现在您的数组可能如下所示:

Array(
    'Menu Label #1' => array(
        0 => array(
            'label' => 'Menu #1, Submenu #1 label',
            'url' => 'http://menu1.submenu1.url'
        ),
        ... /* next item under Menu #1 */
    ),
    'Menu Label #2' => array(
        ...
    ),
    ...
)

然后使用嵌套循环输出数组:

foreach ($menu_array as $menu_label => $submenu_array) {
    echo '<ul><li>' . $menu_label . '</li><ul>';
    foreach ($submenu_array as $submenu_item) {
        echo '<li><a href="' . $submenu_item['url'] . '">' . $submenu_item['label'] . '</a></li>';
    }
    echo '</ul></ul>';
}

答案 2 :(得分:-1)

如果您需要一个菜单​​,我建议您使用这种基本方式。 使用一个表格作为菜单。 使用此结构

menu_id  |  menu_name  | ..... | main_menu
    1         File                null
    2         Save                  1
    3         Save As               1
    4         About               null

想法......所有带有空白'main_menu'字段的菜单都是第一个菜单项。 当您获得第一个菜单时,ypu可以使用

加载所有子菜单
 select * from menus where main_menu='1'

然后你可以将它添加到你的表格中。

最后你的表必须看起来像

array
(
    "1"=>array( "2" , "3"),
    "4"=>About
)

更新: 您可以使用此查询获取所有菜单

 (select * from menus where menus.main_menu is null )
 union
 (select M1.menu_id,M2.menu_name,M2.main_menu from menus M1 join menus M2 on M1.menu_id = M2.main_menu)

结果是

1       Exit    1
1       File    NULL
1       Save    1
1       Save As 1
4       About   NULL

您可以在此处使用for statement打印菜单。 此外,如果您需要子菜单下的子菜单,您可以将查询更改为存在

(select *,menu_id from menus where menus.main_menu is null )
union
(select M1.menu_id,M2.menu_name,M2.main_menu,M2.menu_id from menus M1 join menus M2 on M1.menu_id = M2.main_menu)