在循环中回显会话数组不起作用

时间:2012-05-29 22:37:09

标签: php arrays session

我有一个奇怪的问题,回应出一个会话数组。我想完成以下任务:

for($i=0;$i<sizeof($_SESSION['medication']);$i++){
    echo $_SESSION['medication'][$i];
}

实际上它回显了数组的所有字段然后之后显示众所周知的错误消息“Catchable fatal error:类stdClass的对象无法转换为字符串”。

然而,当我只是在循环中回显字段0而不是字段$ i时,它可以正常工作而没有错误消息。

为什么会触发错误信息?

更新1

var_dump($_SESSION['medication'])回应了一堆东西:

array(12) { [0]=> string(1) "1" [1]=> int(10) [2]=> string(2) "14" [3]=> string(2) "17" [4]=> object(stdClass)#1 (7) { ["id"]=> string(1) "1" ["name"]=> string(9) "AUGMENTIN" ["strength"]=> string(6) "875 mg" ["sig"]=> string(29) "1 tablet by mouth twice a day" ["quantity"]=> string(6) "twenty" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "sinus, bronchitis" } [5]=> object(stdClass)#2 (7) { ["id"]=> string(2) "10" ["name"]=> string(8) "DIFLUCAN" ["strength"]=> string(6) "150 mg" ["sig"]=> string(47) "1 tablet by mouth as needed for yeast infection" ["quantity"]=> string(3) "one" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(27) "yeast, other abx for female" } [6]=> object(stdClass)#3 (7) { ["id"]=> string(2) "14" ["name"]=> string(14) "MEDROL DOSEPAK" ["strength"]=> string(1) "-" ["sig"]=> string(135) "6 PO Qday x 1 day, then 5 PO Qday x 1 day, then 4 PO Qday x 1 day, then 3 PO Qday x1 day, then 2 PO Qday x 1 day then 1 PO Qday x 1 day" ["quantity"]=> string(2) "21" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "allergic rhinitis" } [7]=> object(stdClass)#4 (7) { ["id"]=> string(2) "17" ["name"]=> string(23) "FLUTICASONE NASAL SPRAY" ["strength"]=> string(6) "0.0005" ["sig"]=> string(91) "1 spray each nostril twice a day, reducing to 1 spray per nostril per day when appropriate." ["quantity"]=> string(10) "one bottle" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(17) "allergic rhinitis" } [8]=> object(stdClass)#5 (7) { ["id"]=> string(1) "1" ["name"]=> string(9) "AUGMENTIN" ["strength"]=> string(6) "875 mg" ["sig"]=> string(29) "1 tablet by mouth twice a day" ["quantity"]=> string(6) "twenty" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "sinus, bronchitis" } [9]=> object(stdClass)#6 (7) { ["id"]=> string(2) "10" ["name"]=> string(8) "DIFLUCAN" ["strength"]=> string(6) "150 mg" ["sig"]=> string(47) "1 tablet by mouth as needed for yeast infection" ["quantity"]=> string(3) "one" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(27) "yeast, other abx for female" } [10]=> object(stdClass)#7 (7) { ["id"]=> string(2) "14" ["name"]=> string(14) "MEDROL DOSEPAK" ["strength"]=> string(1) "-" ["sig"]=> string(135) "6 PO Qday x 1 day, then 5 PO Qday x 1 day, then 4 PO Qday x 1 day, then 3 PO Qday x1 day, then 2 PO Qday x 1 day then 1 PO Qday x 1 day" ["quantity"]=> string(2) "21" ["refills"]=> string(4) "zero" ["treatmentfor"]=> string(17) "allergic rhinitis" } [11]=> object(stdClass)#8 (7) { ["id"]=> string(2) "17" ["name"]=> string(23) "FLUTICASONE NASAL SPRAY" ["strength"]=> string(6) "0.0005" ["sig"]=> string(91) "1 spray each nostril twice a day, reducing to 1 spray per nostril per day when appropriate." ["quantity"]=> string(10) "one bottle" ["refills"]=> string(3) "one" ["treatmentfor"]=> string(17) "allergic rhinitis" } } 

更新2

我发现了问题:在代码后面我使用变量$药物,这似乎是指会话。怎么会? register_globals是否开启?

更新3 - 找到解决方案 register_globals确实在(多么令人尴尬),我把它关掉了。它与其他变量$药物有关。现在它工作正常。谢谢大家!

3 个答案:

答案 0 :(得分:1)

为什么要尝试使用for循环数组? foreach专门用于迭代数组。

尝试:

foreach($_SESSION['medication'] as $foo){
    echo $foo;
}

您可能正如其他人所建议的那样在$_SESSION['medication']中存储对象。您应该尝试var_dump($_SESSION['medication']);来查看实际存储在那里的内容,如果其中有实际的对象(stdClass),您需要在运行循环之前将其删除,因为您无法回显类。

编辑:

$_SESSION['medication'][4]并且之后的所有元素都包含一个对象作为值,你必须做一些其他事情而不是回应它(尝试print_r像其他人所建议的那样)

答案 1 :(得分:1)

我的猜测是你在会话数组的索引中存储了一些字符串。在这种情况下,您似乎在数组中有一个stdClass对象。

此外,由于您可以使用非数字数组索引,因此使用foreach循环将产生更好的结果。

foreach($_SESSION['medication'] as $index => $value) {
    if (is_scalar($value)) {
        echo "$index = $value<br />";
    } else {
        echo "<pre>$index = " . print_r($value, true) . "</pre><br />";
    }
}

is_scalar将检查变量是否可以回显(string,int,float,bool),否则我们将print_r值。

答案 2 :(得分:0)

该会话数组中的StdClass类型的对象无法回显

另外,使用foreach