4

私はphpで関数を持っていました:

//simple method with array()
$sensors = array();
$query = "select id, x(transform(wkb_geometry,". $epsg . ")) as lon, y(transform(wkb_geometry,". $epsg . ")) as lat from mytable;";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
while ($row = pg_fetch_assoc($result)) {
    //var_dump($row);
    $mySensor = new sensor($row['id'],$row['lat'],$row['lon']);
    $sensors[] = $mySensor->geoJSON();
}

echo json_encode($sensors);

出力:

"features": [{
    "type": "Feature",
    "id": 1579028,
    "x": 4.85310557823,
    "y": 52.7205622103,
    "geometry": {
      "type": "Point",
      "coordinates": [4.85310557823, 52.7205622103],
      "crs": {
        "type": "OGC",
        "properties": {
          "urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
        }
      }

これで、配列を次のようなオブジェクトに書き直しました。

//advanced method with arrayObject:
class sensors extends ArrayObject {
    function __construct($epsg){
        $query = "select id, x(transform(wkb_geometry,". $epsg . ")) as lon, y(transform(wkb_geometry,". $epsg . ")) as lat from mytable;";
        $result = pg_query($query) or die('Query failed: ' . pg_last_error());
        while ($row = pg_fetch_assoc($result)) {
            //var_dump($row);
            $mySensor = new sensor($row['id'],$row['lat'],$row['lon']);
                $this[] = $mySensor->geoJSON();
            }
        }
    }
}
$newsensors = new sensors($epsg);
echo echo json_encode($newsensors);

ただし、これにより出力が次のように変更されます。

"features": {
  "0": {
    "type": "Feature",
    "id": 1579028,
    "x": 4.85310557823,
    "y": 52.7205622103,
    "geometry": {
      "type": "Point",
      "coordinates": [4.85310557823, 52.7205622103],
      "crs": {
        "type": "OGC",
        "properties": {
          "urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
        }
      }
    }
  },

これにより、OpenLayersのgeoJSONとして使用できなくなります。json_encode関数がこのように動作するのはなぜですか?インデックス番号の設定をオフにすることはできますか?これは可能性のある小さなバグですか?

4

3 に答える 3

11

json_encodeArrayAccessインターフェースを実装しているオブジェクトであっても、どのオブジェクトでも同じ動作を示しArrayObjectます。パブリックプロパティが使用されます。

必要な動作を取得するには、を呼び出すことで取得できる実際の配列を渡す必要がありますArrayObject::getArrayCopy()(または、オブジェクトを配列にキャストできます)。

echo json_encode($newsensors->getArrayCopy());
于 2010-04-26T20:34:30.273 に答える
2

異なるレベルでArrayObjectを含むデータツリーを変換する必要があったため、jsonを出力する前にすべてのArrayObjectを処理および変換するコードを記述しました。これが役立つことを願っています: https ://github.com/nfroidure/Rest4/blob/master/php/ class.Json.php

于 2013-04-17T16:08:20.430 に答える
1

JsonSerializableインターフェイス(PHP 5> = 5.4.0、PHP 7)を使用すると、安全になります。

public function jsonSerialize()
{
    return $this->getArrayCopy();
}
于 2016-07-02T10:37:39.620 に答える