PHP嵌套的foreach()给出警告:为foreach()提供的参数无效

时间:2018-07-18 20:14:33

标签: php mysql pdo foreach

我有一个嵌套的while循环,可以获取Mega菜单。 while循环返回我确切想要的正确数组数据。我试图通过使用foreach()来反映这一点,但出现错误。

这是我的PHP

$cats = array();
$catSQL = $pdo->prepare("SELECT * FROM category");
$catSQL-> execute();

while($rowCat = $catSQL->fetch()) {
    $cat = array();
    $cat['id']   = $rowCat['cat_id'];
    $cat['name'] = $rowCat['cat_name'];

    $childCat = array();

    $subCatSQL = $pdo->prepare("SELECT * FROM sub_category WHERE sc_cat = ".$rowCat['cat_id']);
    $subCatSQL-> execute();

    while($subCatResult = $subCatSQL->fetch()) {
        $subCatID = $subCatResult['sc_id'];
        $project = $subCatResult;

        $childCats = array();

        $childCatSQL = $pdo->prepare("SELECT * FROM child_category WHERE cc_subcat=".$subCatID);
        $childCatSQL-> execute();

        while($childCatResult = $childCatSQL->fetch()) {
            $childCats[] = $childCatResult;
            $project['ccname'] = $childCats;
        }
        $childCat[] = $project;
    }
    $cat['categories'] = $childCat;
    $cats[] = $cat;
    // echo "<pre>"; print_r($cat);
}


foreach($cats as $cat){
 echo "<p>".$cat['name']."</p>";

  foreach($cat['categories'] as $subcat){
    echo "<p>".$subcat['sc_name']."</p>";

    foreach($subcat['ccname'] as $childcat){
      echo "<p>".$childcat['cc_name']."</p>";
    }

  }

}

这是我来自print_r($cat);的数组数据

Array
(
    [id] => 1
    [name] => Computers
    [categories] => Array
        (
            [0] => Array
                (
                    [sc_id] => 1
                    [0] => 1
                    [sc_cat] => 1
                    [1] => 1
                    [sc_name] => Laptops
                    [2] => Laptops
                    [ccname] => Array
                        (
                            [0] => Array
                                (
                                    [cc_id] => 1
                                    [0] => 1
                                    [cc_subcat] => 1
                                    [1] => 1
                                    [cc_name] => Hewlett-Packard
                                    [2] => Hewlett-Packard
                                )

                            [1] => Array
                                (
                                    [cc_id] => 2
                                    [0] => 2
                                    [cc_subcat] => 1
                                    [1] => 1
                                    [cc_name] => Dell
                                    [2] => Dell
                                )

                            [2] => Array
                                (
                                    [cc_id] => 3
                                    [0] => 3
                                    [cc_subcat] => 1
                                    [1] => 1
                                    [cc_name] => Lenovo
                                    [2] => Lenovo
                                )

                            [3] => Array
                                (
                                    [cc_id] => 4
                                    [0] => 4
                                    [cc_subcat] => 1
                                    [1] => 1
                                    [cc_name] => Acer
                                    [2] => Acer
                                )

                        )

                )

            [1] => Array
                (
                    [sc_id] => 2
                    [0] => 2
                    [sc_cat] => 1
                    [1] => 1
                    [sc_name] => Desktops
                    [2] => Desktops
                    [ccname] => Array
                        (
                            [0] => Array
                                (
                                    [cc_id] => 5
                                    [0] => 5
                                    [cc_subcat] => 2
                                    [1] => 2
                                    [cc_name] => Dell
                                    [2] => Dell
                                )

                            [1] => Array
                                (
                                    [cc_id] => 6
                                    [0] => 6
                                    [cc_subcat] => 2
                                    [1] => 2
                                    [cc_name] => Lenovo
                                    [2] => Lenovo
                                )

                        )

                )

        )

)

Array
(
    [id] => 2
    [name] => Components
    [categories] => Array
        (
            [0] => Array
                (
                    [sc_id] => 3
                    [0] => 3
                    [sc_cat] => 2
                    [1] => 2
                    [sc_name] => Monitors
                    [2] => Monitors
                )

            [1] => Array
                (
                    [sc_id] => 4
                    [0] => 4
                    [sc_cat] => 2
                    [1] => 2
                    [sc_name] => Printers
                    [2] => Printers
                )

            [2] => Array
                (
                    [sc_id] => 5
                    [0] => 5
                    [sc_cat] => 2
                    [1] => 2
                    [sc_name] => Scanners
                    [2] => Scanners
                )

            [3] => Array
                (
                    [sc_id] => 6
                    [0] => 6
                    [sc_cat] => 2
                    [1] => 2
                    [sc_name] => Web Cameras
                    [2] => Web Cameras
                )

        )

)

这是我在页面中收到的带有错误的数据。

Computers

Laptops

Hewlett-Packard

Dell

Lenovo

Acer

Desktops

Dell

Lenovo

Components

Monitors

Notice: Undefined index: ccname in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Warning: Invalid argument supplied for foreach() in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Printers

Notice: Undefined index: ccname in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Warning: Invalid argument supplied for foreach() in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Scanners

Notice: Undefined index: ccname in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Warning: Invalid argument supplied for foreach() in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Web Cameras

Notice: Undefined index: ccname in E:\xampp\htdocs\flexicart\common-codes.php on line 54

Warning: Invalid argument supplied for foreach() in E:\xampp\htdocs\flexicart\common-codes.php on line 54

在这里您可以看到,尽管我获取了所有我需要的数据,但似乎仍然无处发生此未定义索引错误。我不明白为什么会这样。请帮忙。

1 个答案:

答案 0 :(得分:2)

您正在内部while循环中设置$project['ccname']。但是,如果没有子类别,则不会输入循环。这也是浪费的,因为您在每次循环迭代中都一次又一次地覆盖它。

    while($childCatResult = $childCatSQL->fetch()) {
        $childCats[] = $childCatResult;
        $project['ccname'] = $childCats; // <-- wan't be set if there are no child categories
    }
    $childCat[] = $project;

您需要在内部while循环之外设置$project['ccname'] = $childCats;

    while($childCatResult = $childCatSQL->fetch()) {
        $childCats[] = $childCatResult;
    }
    $project['ccname'] = $childCats; // <---------- here
    $childCat[] = $project;