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

时间:2011-06-22 15:39:52

标签: php arrays foreach

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

$res = $db->getResult(); // $res is an array

我将它用于print_r:

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
        )

与foreach:

foreach ($res as $row) {
    echo $row['id'] . ' ' . $row['firstname'] . ' ' . $row['lastname'] . '<br />';
}

它输出:

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中的一种吗?

感谢。

4 个答案:

答案 0 :(得分:3)

是的,看起来这正是发生的事情。最有可能的是,$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 />';
}

答案 1 :(得分:2)

显然,当你只有一个结果时,你的db对象会返回一个数组:

Array
(
    [id] => 2
    [firstname] => Slim
    [lastname] => Nejmaoui
)

你可以测试第一个输入,如果这不是一个数组,不要循环thrue foreach else foreach foreach

if( is_array(current($res)) ){
  // do the foreach...
}else{
  echo $res['id'] . ' ' . $res['firstname'] . ' ' . $res['lastname'] . '<br />';
}

我认为你应该改变你的db类,即使在单行结果上也总是返回一个嵌套数组,以保持你的结果一致。

答案 2 :(得分:1)

您使用的是CodeIgniter吗?因为它看起来像你。在CodeIgniter中,当只有一个结果时,它只返回一个数组。

我的建议?创建一个支持函数(下面为do_something_with_row),然后有条件地调用它:

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

答案 3 :(得分:1)

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

你不会注意到的是$row只包含标量值:

  1. 1(int)
  2. Mohamed(字符串)
  3. KadriK(字符串)
  4. 这是每次迭代(1-3)已经$row的内容。

    使用方括号的substring access syntax访问这些值,使用方括号。

    由于所有indezies 'id''firstname''firstname'都被解释为常量未定义且导致0,因此您实际上正在访问第一个字符/字节在字符串中:1MK

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

    现在重要的部分:如果您正在开发或者您在寻找错误,请启用通知记录。他们会警告您这些事情:

    PHP Notice:  Use of undefined constant Kadri - assumed 'Kadri' in ...
    

    快速设置可以通过添加:

    来完成
      error_reporting(-1);
      ini_set('display_errors', 1);