0

产生奇怪输出的语句是

$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不是一个数组,并且它没有这样的键,如果是这样,它应该产生异常或错误。但它只打印这两个字符串的第一个字母

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

4

3 回答 3

3

因为 $details 包含一个字符串而不是一个数组,所以键 'title' 被强制转换为 int。(int)'title' 返回 0。$details[0] 是 't'。

echo (int)'title';

打印出 0

$string = "hello world";
echo $string['title'];

打印出'h'

$string = "hello world";
echo $string['1title'];

打印出 'e' 因为 (int)'1title' 被强制转换为 1。

于 2012-09-17T10:40:38.430 回答
1

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

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

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

混合所有:

$details = "title";

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

$details[0] > "t"

$details[1] > "i"
于 2012-09-17T10:44:04.120 回答
0

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

只需添加检查以确保 details 是一个数组:

if (is_array($details))
{
   // stuff here
}
于 2012-09-17T10:39:31.800 回答