为什么我在foreach循环中得到奇怪的输出?

时间:2012-09-17 10:25:18

标签: php foreach

产生奇怪输出的语句是

$response = '{"17366":{"title":"title1","content":"content1"},"22747":{"title":"title2","content":"content2"}}';
$result = json_decode($response, true);

foreach ($result as $document => $details) {
    echo "Title : {$details['title']}, ";
    echo "content : {$details['content']} ";
    echo '<br>';
}

//prints, this one ok
//Title : title1, content : content1 
//Title : title2, content : content2

但是如果

$response = '{"title":"title1"}';
$result = json_decode($response, true);

foreach ($result as $document => $details) {
    echo "Title : {$details['title']}, ";
    echo "content : {$details['content']} ";
    echo '<br>';
}

//prints
//Title : t, content : t

在这种情况下,我知道$details不是数组,并且它没有这样的键,如果是这样,它应该产生异常或错误。但它只会打印的字符串第一个字母

任何人都请指出我做错了什么?或是这种行为,我没有断言?

2 个答案:

答案 0 :(得分:1)

它打印第一个字母,因为它试图将关联的密钥转换为整数索引。

因此,当PHP将字符串转换为整数时,通常会返回0,除非字符串的第一个字符是数字。

另一方面,当您的代码尝试使用索引访问字符串时,PHP将返回索引指定的字符串的字符。

混合全部:

$details = "title";

$details['content'] > $details[(int) 'content'] > $details[0]

$details[0] > "t"

$details[1] > "i"

答案 1 :(得分:0)

如果您使用[]语法,则详细信息是字符串,您可以从该位置的字符串中选择字符。在'title'或'details'位置选择一个字符实际上不会产生错误,而是PHP处理它就像你选择第一个字符,即$details[0]一样。

只需添加支票即可确保详细信息为数组:

if (is_array($details))
{
   // stuff here
}