json_encode array PHP sparsi come array JSON, non oggetto JSON


119

Ho il seguente array in PHP:

Array
(
    [0] => Array
        (
            [id] => 0
            [name] => name1
            [short_name] => n1
        )

    [2] => Array
        (
            [id] => 2
            [name] => name2
            [short_name] => n2
        )
)

Voglio codificarlo JSON come array JSON, producendo una stringa come la seguente:

[  
    {  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    {  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
]

Ma quando chiamo json_encodequesto array, ottengo quanto segue:

{  
    "0":{  
        "id":0,
        "name":"name1",
        "short_name":"n1"
    },
    "2":{  
        "id":2,
        "name":"name2",
        "short_name":"n2"
    }
}

che è un oggetto invece di un array.

Come posso invece json_encodecodificare il mio array come array?

Risposte:


194

Stai osservando questo comportamento perché il tuo array non è sequenziale: ha chiavi 0e 2, ma non ha1 come chiave.

Avere solo indici numerici non è sufficiente. json_encodecodificherà il tuo array PHP come array JSON solo se il tuo array PHP è sequenziale, cioè se le sue chiavi sono 0, 1, 2, 3, ...

Puoi reindicizzare il tuo array in sequenza usando la array_valuesfunzione per ottenere il comportamento che desideri. Ad esempio, il codice seguente funziona correttamente nel tuo caso d'uso:

echo json_encode(array_values($input)).

4
ma cosa succede se le chiavi 0,2sono importanti? Sono nella stessa situazione in cui non posso reindicizzare l'array.
shyammakwana.me

2
JSON non supporta l'array associativo. fare riferimento: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh

74

Arrayin JSONsono solo array indicizzati , quindi la struttura che stai cercando di ottenere non è Json / Javascript valido.

Gli array PHP Associatives sono oggetti in JSON, quindi a meno che non sia necessario l'indice, non è possibile eseguire tali conversioni.

Se vuoi ottenere tale struttura puoi fare:

$indexedOnly = array();

foreach ($associative as $row) {
    $indexedOnly[] = array_values($row);
}

json_encode($indexedOnly);

Restituirà qualcosa come:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]

1
Grazie per avermi dato l'indizio dell'array indicizzato :) il problema è stato che l'ho indicizzato in modo tale che l'id fosse anche l'id dell'array invece di un id sequenziale e json_encode non lo raccolse come array ma come in oggetto invece perché l'array non era sequenziale è stato risolto ora grazie per tutto il vostro aiuto ragazzi :)

Non vero. Alcune librerie codificano array associativi come array con index come una delle proprietà dell'elemento.
Gustavo

Non capisco cosa intendi: l'array nella risposta di Martin non è indicizzato e questo è JSON valido.
E infine il

@AndFinally, l'array nella risposta di Martin è effettivamente indicizzato, implicitamente. Omettendo index si ottiene un array indicizzato a partire da zero.
Boris Guéry

Questa risposta non ha fornito esattamente ciò che l'OP voleva nel momento in cui ha pubblicato la domanda (non sorprende, poiché ciò che l'OP voleva era impossibile), e le loro modifiche da allora hanno lasciato questa risposta apparentemente selvaggiamente sbagliata dato lo stato attuale del domanda. Non puoi eliminare questa risposta, poiché è accettata, ma forse segnalare a un moderatore di eliminarla per te? Dato che ha più di 5 voti positivi, manterrai il tuo rappresentante.
Mark Amery

0

json_decode ($ jsondata, true);

true trasforma tutte le proprietà in array (sequenziali o meno)


non si riferisce alla domanda posta da OP. OP ha chiesto specificamente il problema di codifica riscontrato utilizzandojson_encode
pg2286

come non è correlato? questo mostra un esempio di utilizzo di json_encode in modo da trasformare i dati in un array leggibile. La domanda di OP è "Come posso fare in modo che json_encode codifichi il mio array come un array" il mio bit di codice fa proprio questo .. Sto pensando che è la parola "Encode" che ti sta causando greef? Con "codifica" significa "si trasforma in". Non è un motivo per votare in negativo.
Robert Sinclair

oh, ora capisco il tuo punto, che consiglieresti qualcosa del genere alla $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); fine finallySerializedInArrayFormat = json_encode($unserialize);se questo è ciò che intendi, hai ragione, ma sembra una soluzione un po 'senza fiato.
pg2286

-1

Prova questo,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>

questo non risolve il problema che sta cercando di chiedere l'OP.
pg2286
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.