Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多维数组使用foreach返回错误结果_Php_Arrays_Foreach - Fatal编程技术网

Php 多维数组使用foreach返回错误结果

Php 多维数组使用foreach返回错误结果,php,arrays,foreach,Php,Arrays,Foreach,我有一个php类,它与mysql数据库交互,然后获取一个数组作为结果 $res = $db->getResult(); // $res is an array 我将其与打印一起使用: print_r($res); 它的输出是: Array ( [0] => Array ( [id] => 1 [firstname] => Mohamed [lastname] => Kadri

我有一个php类,它与mysql数据库交互,然后获取一个数组作为结果

$res = $db->getResult(); // $res is an array
我将其与打印一起使用:

print_r($res);
它的输出是:

Array ( [0] => Array ( [id] => 1 [firstname] => Mohamed [lastname] => Kadri ) [1] => Array ( [id] => 2 [firstname] => Slim [lastname] => Nejmaoui ) [2] => Array ( [id] => 3 [firstname] => Sameh [lastname] => Chraiti )
1 Mohamed Kadri
2 Slim Nejmaoui
3 Sameh Chraiti
但当只有一行时,它显示如下:

1 1 1
M M M    
K K K
(1是id,M是名字中的第一个字母,K是姓氏中的第一个字母)

因此,当有多行时,类可能会生成一个多维数组,foreach将处理它,当只有一行时,它会生成一个简单数组,该数组将被这个精确的foreach视为多维数组

那么我应该设置一个条件来处理两种类型的foreach中的一种吗


谢谢。

是的,看起来事情就是这样。当查询只返回一行时,
$db->getResult()
很可能将结果行作为数组(而不是结果中的子数组)返回。因此,您需要检测是否存在嵌套数组并适当处理:

if (isset($res[0]) && is_array($res[0])){
    foreach ($res as $row) {
        echo $row['id'] . ' ' . $row['firstname'] . ' ' . $row['lastname'] . '<br />';
    }
}else{
    echo $res['id'] . ' ' . $res['firstname'] . ' ' . $res['lastname'] . '<br />';
}
if(isset($res[0])&is_数组($res[0])){
foreach($res作为$row){
echo$row['id'].'.$row['firstname'.'.'..$row['lastname'.].
; } }否则{ echo$res['id'].'.$res['firstname'.'.'.$res['lastname'.].
; }
您正在使用CodeIgniter吗?因为看起来你是。在CodeIgniter中,当只有一个结果时,它只返回一个数组

我的建议?创建一个支持函数(
使用下面的行做某事),然后有条件地调用它:

if(count($res) > 1)
{
    foreach($res as $row)
    {
        do_something_with_a_row($row);
    }
}
else
{
    do_something_with_a_row($res);
}

显然,当只有一个类似这样的结果时,db对象返回单个数组:

Array
(
    [id] => 2
    [firstname] => Slim
    [lastname] => Nejmaoui
)
您可以测试第一个输入,如果这不是一个数组,则不要循环通过foreach,否则执行foreach

if( is_array(current($res)) ){
  // do the foreach...
}else{
  echo $res['id'] . ' ' . $res['firstname'] . ' ' . $res['lastname'] . '<br />';
}
if(是_数组(当前($res))){
//做foreach。。。
}否则{
echo$res['id'].'.$res['firstname'.'.'.$res['lastname'.].
; }

我认为您应该更改db类,使其始终返回嵌套数组,即使在单行结果上也是如此,以保持结果的一致性。

在您不清楚的情况下,您正在迭代一个结果行

您没有注意到的是,
$row
然后只包含标量值:

  • 1
    (int)
  • Mohamed
    (字符串)
  • KadriK
    (字符串)
  • 这是每个迭代(1-3)中已有的
    $row
    的内容

    通过使用方括号访问这些值,这些值看起来就像一个数组

    由于所有索引
    'id'
    'firstname'
    'firstname'
    都被解释为常量,这些常量都未定义,并导致
    0
    ,因此实际上您正在访问字符串中的第一个字符/字节:
    1
    M
    K

    使用较新版本的PHP,甚至不会返回
    1

    现在重要的部分是:如果您开发或查找错误,请启用通知日志。他们会提醒您以下事项:

    PHP Notice:  Use of undefined constant Kadri - assumed 'Kadri' in ...
    
    可以通过添加以下内容来完成快速设置:

      error_reporting(-1);
      ini_set('display_errors', 1);
    

    在这里它可以工作,但它返回了一个错误:注意:未定义的偏移量:D:\www\test\index.php中的0在第51行(这是代码“if($res[0]){”)您最好测试当前($res)是数组还是字符串,这个错误是因为在没有设置$res[0]的单个结果的情况下,您还可以更改if($res[0])根据if(isset($res[0])).你们都是对的-这只是我测试变量是否存在的简写,但在技术上并不正确。答案已编辑。启用所有类型错误的报告,以便PHP告诉您代码中的潜在问题。怎么回事?您得到了什么以及您希望得到什么?好的,在这里它工作得很好,但如果我有一个零结果数组,它会得到一个e错误提示这些索引(id、firstname、lastname)未定义。如何修复?
      error_reporting(-1);
      ini_set('display_errors', 1);