2010-04-26 3 views
4

J'ai eu une fonction en php:json_encode comportement différent sur ArrayObject vs array()

//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); 

qui délivre:

"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" 
       } 
      } 

Maintenant, j'ai réécrit le tableau pour devenir un objet comme celui-ci:

//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); 

Mais cela change la sortie:

"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" 
         } 
        } 
       } 
      }, 

Ce qui le rend inutilisable comme geoJSON pour OpenLayers. Pourquoi la fonction json_encode se comporte-t-elle de cette façon? Puis-je désactiver le réglage des numéros d'index? Est-ce un petit bug possible?

Répondre

10

json_encode affichera le même comportement avec n'importe quel objet, même ceux implémentant l'interface ArrayAccess comme le fait ArrayObject; les propriétés publiques sont utilisées.

Pour obtenir le comportement souhaité, vous devez lui transmettre un tableau réel qui peut être récupéré en appelant ArrayObject::getArrayCopy() (ou vous pouvez convertir l'objet en tableau).

echo json_encode($newsensors->getArrayCopy()); 
+0

Merci beaucoup salathe! Votre solution fonctionne parfaitement pour moi! – milovanderlinden

1

Utilisez l'interface JsonSerializable (PHP 5> = 5.4.0, PHP 7) et vous devriez être en sécurité:

public function jsonSerialize() 
{ 
    return $this->getArrayCopy(); 
} 
Questions connexes