Shubham Jha
Shubham Jha

Reputation: 63

PHP Nested foreach() gives Warning: Invalid argument supplied for foreach()

I have a nested while loop that fetches Mega Menus. The while loop returns me the proper array data that I exactly want. I am trying to reflect this in using foreach() but I am getting error.

This is my 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>";
    }

  }

}

This is my array data from 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
                )

        )

)

This is the data with error that I am getting in my page.

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

Here as you can see that though I am getting all the data I need still this Undefined Index error seems to occur out of nowhere. I don't understand why this is happening. Please help.

Upvotes: 1

Views: 1058

Answers (1)

Paul Spiegel
Paul Spiegel

Reputation: 31772

You are setting $project['ccname'] within the inner while loop. But the loop will not be entered, if there are no child categories. It is also wasteful, because you are overwriting it again and again in every loop iteration.

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

You need to set $project['ccname'] = $childCats; outside the inner while loop.

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

Upvotes: 2

Related Questions