2016-01-30 15 views
11

Ho bisogno di convertire un array PHP in JSON ma non ottengo quello che mi aspetto. Voglio che sia un oggetto che posso navigare facilmente con un indice numerico. Ecco un esempio di codice:PHP Array to Json Object

$json = array(); 
$ip = "192.168.0.1"; 
$port = "2016"; 
array_push($json, ["ip" => $ip, "port" => $port]); 
$json = json_encode($json, JSON_PRETTY_PRINT); 
// ----- json_decode($json)["ip"] should be "192.168.0.1" ---- 
echo $json; 

Questo è ciò che ottengo

[ 
    [ 
     "ip" => "192.168.0.1", 
     "port" => "2016" 
    ] 
] 

ma voglio ottenere un oggetto invece di matrice:

{ 
    "0": { 
     "ip": "192.168.0.1", 
     "port": "2016" 
    } 
} 

Grazie :)

+2

* Perché * vuoi che l'array esterno diventi un oggetto JSON? Se ha solo i tasti numerici, un array fornisce le stesse informazioni in uno spazio leggermente inferiore ed è più facile lavorare con il lato JS delle cose (puoi usare 'Array :: forEach' e' Array :: map' per esempio). – 00dani

+0

@ 00Davo Grazie, perché ho pensato che fosse più semplice gestirlo quando si tratta di un oggetto hhh, e lo uso principalmente solo sul lato server (PHP) :) P.S. Upvoted –

risposta

18

Si desidera json_encode($json, JSON_FORCE_OBJECT).

Il flag JSON_FORCE_OBJECT, come suggerisce il nome, forza l'output JSON come un oggetto, anche quando altrimenti sarebbe normalmente rappresentato come una matrice.

È possibile anche eliminare l'uso di array_push per un certo codice leggermente più pulito:

$json[] = ['ip' => $ip, 'port' => $port]; 
+0

Grazie, ma questo è quello che ottengo: { "0": { "0": "ip => 192.168.0.1", "1": "port => 2016" }} –

+1

vostre corde sono non esattamente nel posto giusto nel tuo 'array_push'. Prova 'array_push ($ json, [" ip "=> $ ip," porta "=> $ porta]);' – jbafford

4

basta usare solo

$response=array(); 
$response["0"]=array("ip"  => "192.168.0.1", 
        "port" => "2016"); 
$json=json_encode($response,JSON_FORCE_OBJECT); 
+1

Grazie, non l'ho testato ma @jbafford è stato più veloce :), ha fatto un aumento di btw –

3

Per ottenere array con gli oggetti è possibile creare stdClass() al posto di array per oggetti interni come sotto;

<?PHP 

    $json = array(); 
    $itemObject = new stdClass(); 
    $itemObject->ip = "192.168.0.1"; 
    $itemObject->port = 2016; 

    array_push($json, $itemObject); 
    $json = json_encode($json, JSON_PRETTY_PRINT); 
    echo $json; 

?> 

Un esempio di lavoro http://ideone.com/1QUOm6

-1
$ip = "192.168.0.1"; 
$port = "2016"; 
$json = array("response" => array("ip" => $ip, "port" => $port)); 
//IF U NEED AS JSON OBJECT 
$json = [array("ip" => $ip, "port" => $port)]; //IF U NEED AS JSON ARRAY 
$json = json_encode($json); 
echo $json; 
0

Al fine di ottenere un oggetto e non solo una prova stringa JSON:

$json = json_decode(json_encode($yourArray)); 

Se si desidera jsonise gli array nidificati pure fare :

$json =json_decode(json_encode($yourArray, JSON_FORCE_OBJECT));