0

PHPで非常に興味深い問題が発生しています。次のコードは、テキストファイルから行を取得し、そのテキストをjsonとしてstdClassオブジェクトにデコードしてから、そのプロパティの1つで条件付きで配列に配置します。

$fileStream = @fopen($fileName, 'r+');
    $lastUpdate = $_POST['lastUpdate'];
    if($fileStream) {
        $eventArray = array();
        while (($buffer = fgets($fileStream, 8192)) !== false) {
                $decodedEvent = json_decode($buffer);
                echo var_dump($decodedEvent);
            if ($decodedEvent->timestamp > $lastUpdate) {
                array_push($eventArray, $decodedEvent);
            }
        }
        $jsonEvents = json_encode($eventArray);
        echo $jsonEvents;
    }
    else {
        $fileStream = @fopen($fileName, 'a');
    }
    @fclose($fileStream);

これにより、エラーが発生します。

Notice:Trying to get property of non-object in C:\****\gameManager.php on line 23

オブジェクトが複数の方法で有効であることを私は知っています。たとえば、var_dumpはこれを生成しています:

object(stdClass)#1 (3) {
 ["name"]=>
 string(4) "move"
 ["args"]=>
 array(3) {
   [0]=>
   int(24)
   [1]=>
   int(300)
   [2]=>
   int(50)
 }
 ["timestamp"]=>
 float(1352223678463)
}

を使用して$decodedEventにアクセスしようとすると$decodedEvent["timestamp"]、オブジェクトに配列としてアクセスできないというエラーが表示されます。

また、実際には適切なjsonをエコーし​​ますが、これは適切なオブジェクトからのみエンコードできます。

[{"name":"move","args":[24,300,50],"timestamp":1352223678463}]

ここで何かが足りないのですか、それともPHPの動作がおかしいのですか?どんな助けでも大歓迎です。

編集:ファイルからの入力は次のとおりです。

{"name":"move","args":[24,300,50],"timestamp":1352223678463}
4

2 に答える 2

1

JSON形式が正しくありません。それは無効と言っているのではありません。ただし、この形式を指定すると、ルート要素はの配列になりstdClassます。

array(1) {
  [0] =>
  class stdClass#1 (3) {
     // ...

これが本当に単一のオブジェクトである場合、次の適切なJSONを使用してソースでこれを解決します。

{"name":"move","args":[24,300,50],"timestamp":1352223678463}

それが不可能な場合は、適切な配列表記を使用してPHPでアクセスする必要があります。

echo $decodedEvent[0]->timestamp;

アップデート

提供した更新されたJSONは、コードを指定すると有効で正しくフォーマットされているように見えます。私の推測では、ファイル内の行に有効なJSONが含まれていないため(たとえば、空の行)、失敗しjson_decode()ているため、PHP通知が表示されます。

ループでこれをテストすることをお勧めします。

if ($decodedEvent && $decodedEvent->timestamp > $lastUpdate)

また、これは通知であることを忘れないでください。そして、私はクリーンなコードを提唱していますが、厳密に言えばそれはエラーではありません。

于 2012-11-06T18:30:43.237 に答える
0

この関数を試して、stdClassオブジェクトを多次元配列に変換できます

    function objectToArray($d) {
        if (is_object($d)) {
            // Gets the properties of the given object
            // with get_object_vars function
            $d = get_object_vars($d);
        }

        if (is_array($d)) {
            /*
            * Return array converted to object
            * Using __FUNCTION__ (Magic constant)
            * for recursive call
            */
            return array_map(__FUNCTION__, $d);
        }
        else {
            // Return array
            return $d;
        }
    } 

ソース

于 2012-11-06T18:29:52.833 に答える