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'];

(int)'1title' は 1 にキャストされるため、'e' を出力します。

于 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 は最初の文字を選択しているかのように処理します$details[0]

details が配列であることを確認するには、チェックを追加するだけです。

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