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