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.