我有一个与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中的一种吗?
感谢。
答案 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
(int)Mohamed
(字符串)KadriK
(字符串)这是每次迭代(1-3)已经$row
的内容。
使用方括号的substring access syntax访问这些值,使用方括号。
由于所有indezies '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);