我有一个嵌套的while循环来获取大型菜单。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

这里你可以看到,虽然我得到了所有需要的数据,但这个未定义的索引错误似乎是凭空出现的。我不明白为什么会这样。请帮忙。

最佳答案

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

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

您需要将$project['ccname'] = $childCats;设置在内部while循环之外。
    while($childCatResult = $childCatSQL->fetch()) {
        $childCats[] = $childCatResult;
    }
    $project['ccname'] = $childCats; // <---------- here
    $childCat[] = $project;

关于php - PHP嵌套的foreach()给出警告:为foreach()提供的参数无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51410304/

10-12 13:01
查看更多