"Notice: Trying to get property" 用于嵌套菜单

"Notice: Trying to get property" for nested menu

cID cPID cSlug cName
1 0 hello H1
2 0 world WORLD
3 0 mars MARS
4 1 people People
5 1 dogs Dogs
6 3 cats Cats:)

cPID:父 ID

PHP:

$getMenuData = $db->table($vtCategories)->getAll();
$menu = [];
foreach ($getMenuData as $row) {
    if ($row->cPID === 0) {
        $menu[$row->cID] = $row;
        $menu[$row->cID]['submenus'] = [];
    } else {
        $menu[$row->cPID]['submenus'][] = $row;
    }
}
foreach ($menu as $item) {
    echo $item->cID . '<br>' . PHP_EOL;    //  <<--- LINE 16
    foreach ($item['submenus'] as $subitem) {
        echo '<br>' . $subitem->cName . '--' . $subitem->cPID . PHP_EOL;
    }
}

我收到这个错误:

Notice: Trying to get property 'cID' of non-object in /var/www/clients/client7/web31/web/test1.php on line 16

我哪里做错了?

如果$row是一个对象,你不能做$menu[$row->cID]['submenus'],因为$menu[$row->cID]是一个对象,不是数组。

你应该使用 $menu[$row->cID]->submenus.

此外,$row->cPID === 0 不是一个好的条件,因为如果 cPID 不为 0,则不会创建“主”条目。

如果主条目不存在,您可以使用 if (!isset($menu[$row->cID])) { 创建主条目,如果定义了 cPID,则可以使用 if ($row->cPID > 0) { 添加。

完整代码

$menu = [];
foreach ($getMenuData as $row) {
    if (!isset($menu[$row->cID])) {
        $menu[$row->cID] = $row;
        $menu[$row->cID]->submenus = [];
    } 
    if ($row->cPID > 0) {
        $menu[$row->cPID]->submenus[] = $row;
    }
}
foreach ($menu as $item) {
    
    echo $item->cID . '<br>' . PHP_EOL;    //  <<--- LINE 16
    foreach ($item->submenus as $subitem) {
        echo '<br>' . $subitem->cName . '--' . $subitem->cPID . PHP_EOL;
    }
}

输出:

1<br>
<br>People--1
<br>Dogs--1
2<br>
3<br>
<br>Cats:)--3