php - PHP嵌套foreach()给出警告:为foreach()提供的参数无效
问题描述
我有一个嵌套的 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
在这里,您可以看到,虽然我得到了我需要的所有数据,但这个未定义索引错误似乎无处不在。我不明白为什么会这样。请帮忙。
解决方案
您正在$project['ccname']
内部 while 循环中进行设置。但如果没有子类别,则不会进入循环。这也很浪费,因为您在每次循环迭代中一次又一次地覆盖它。
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;
推荐阅读
- autodesk-forge - 如何显示与文件中所有问题相对应的问题 ID?
- javascript - 简化 Javascript 中的 if 语句
- javascript - 跟踪脚本的返回值
- security - 为具有空 src 值的 iframe 更正 CSP frame-src 值
- reactjs - 检查 AsyncStorage 中的值后导出反应本机 stackNavigator
- ios - 如果项目集成了另一个 CollectionView,则无法选择 CollectionView 项目
- python - 如何减轻 Python Dictionary 中的错误?
- c# - 在 Firefox 打印中以语法方式提供文件名并点击保存按钮
- javascript - JSON Web 密钥的“ext”属性是什么?
- sql - 使用列名称 ColumnWise 获取 RowsWise 数据