我不能像foreach一样使用嵌套循环

时间:2018-08-22 20:31:49

标签: php foreach nested

问题很容易。答案不是

我有一个具有多个(2)维的数组。 代码很简单(第28-32行):

<?php
foreach($select_all_data as $key => $value) {
    foreach ($value as $v => $k) {
        $all_values = $v.",";
    }
}
?>

但是当我执行它时,它显示了我 Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\qlb\test.php on line 29

(我还使用is_array测试了$ value al数组,这使我成真了)

循环中$ value的示例输出是:

array(12) { ["id"]=> string(3) "101" ["aangever_voornaam"]=> string(8) "censored" ["aangever_achternaam"]=> string(6) "censored" ["aangever_geslacht"]=> string(3) "Male" ["pleegplaats"]=> string(6) "censored" ["pleegdatum"]=> string(10) "dd-mm-yyyy" ["pleegtijd"]=> string(5) "hh:mm" ["verbalisant"]=> string(12) "censored" ["verklaring"]=> string(229) "censored" ["opnamedatum"]=> string(19) "yyyy-mm-dd hh:mm:ss" ["status"]=> string(4) "open" ["behandelaar"]=> string(12) "censored" }

如您所见,它是一个不错的数组,我想放入循环中。但这给了我无效的参数错误。

我做错了什么?

记录:我试图创建一个脚本以使用该脚本导出整个数据库

<?php
$DB_HOST = "";
$DB_USER = "";
$DB_PASS = "";
$DB_NAME = "";

$con = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($con->connect_errno > 0) {
  die('Connection failed [' . $con->connect_error . ']');
}

$select_all_tables = array();
$select_all_data = array();
$show_tables_from = $con->query("SHOW TABLES FROM `$DB_NAME`");
while ($row = $show_tables_from->fetch_assoc()) {
    $select_all_tables[] = $row['Tables_in_'.$DB_NAME.''];
}
foreach ($select_all_tables as $a) {
    $q = $con->query("SHOW CREATE TABLE `$a`");
    $show_create_table[] = $q->fetch_assoc()['Create Table'];
    $q = $con->query("SELECT * FROM `$a`");
    $select_all_data[] = $q->fetch_assoc();
}
echo "<pre>";
//var_dump($a);
//var_dump($show_create_table);
//var_dump($select_all_data);
foreach($select_all_data as $key => $value) {
    var_dump($value);
}
?>

2 个答案:

答案 0 :(得分:0)

根据fetch_assoc docs

  

返回一个与所获取的行相对应的关联数组,或者   如果没有更多行,则为NULL。

因此,对于循环内最终变为空的$value元素,将引发该错误。

因此只需将其包装在if语句中,例如:

if (!is_null($value)) {
    foreach ($value as $v => $k) {
        $all_values = $v.",";
    }
}

或者甚至是is_array($value),以确保您能够遍历...

答案 1 :(得分:0)

数组的键数不同。我想是因为我忘了在第一个foreach(之后)中循环查询

所以我将其更改为

foreach ($select_all_tables as $a) {
    $q = $con->query("SHOW CREATE TABLE `$a`");
    $show_create_table[] = $q->fetch_assoc()['Create Table'];
    $q = $con->query("SELECT * FROM `$a`");
    while ($row = $q->fetch_assoc()) {
        $select_all_data[] = $row;
    }
}

这就是解决方案!