Reputation: 63
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
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