array PHP esparso json_encode como array JSON, não objeto JSON

119

Eu tenho a seguinte matriz em PHP:

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

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

Quero codificá-lo em JSON como uma matriz JSON, produzindo uma string como a seguinte:

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

Mas quando chamo json_encodeeste array, obtenho o seguinte:

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

que é um objeto em vez de uma matriz.

Como posso json_encodecodificar meu array como um array, em vez disso?

Martijn Pieters
fonte

Respostas:

194

Você está observando esse comportamento porque seu array não é sequencial - ele possui chaves 0e 2, mas não tem 1como chave.

Apenas ter índices numéricos não é suficiente. json_encodesó codificará sua matriz PHP como uma matriz JSON se sua matriz PHP for sequencial - ou seja, se suas chaves forem 0, 1, 2, 3, ...

Você pode reindexar seu array sequencialmente usando a array_valuesfunção para obter o comportamento desejado. Por exemplo, o código abaixo funciona com sucesso em seu caso de uso:

echo json_encode(array_values($input)).
Nguyen Van Vinh
fonte
4
mas e se as chaves 0,2forem importantes? Estou na mesma situação em que não consigo reindexar array.
shyammakwana.me
2
JSON não oferece suporte a matriz associativa. consulte: tools.ietf.org/html/rfc7159#section-5
Nguyen Van Vinh
74

Arrayem JSONsão apenas matrizes indexadas , portanto, a estrutura que você está tentando obter não é Json / Javascript válido.

A matriz PHP Associatives são objetos em JSON, portanto, a menos que você não precise do índice, não poderá fazer tais conversões.

Se você deseja obter essa estrutura, pode fazer:

$indexedOnly = array();

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

json_encode($indexedOnly);

Will retorna algo como:

[
     [0, "name1", "n1"],
     [1, "name2", "n2"],
]
Boris Guéry
fonte
1
Obrigado por me dar a pista do array indexado :) o problema foi indexá-lo de tal forma que o id também era o id do array em vez de um id sequencial e json_encode não o pegou como um array, mas como em objeto em vez disso, porque o array não era sequencial, foi corrigido agora, obrigado por todos os seus
Não é verdade. Algumas bibliotecas codificam arrays associativos como arrays com índice como uma das propriedades do elemento.
Gustavo
Não entendo o que você quer dizer - a matriz na resposta de Martin não é indexada e isso é JSON válido.
E finalmente
@AndFinalmente, o array na resposta de Martin está realmente indexado, implicitamente. A omissão de índice resulta em uma matriz indexada começando do zero.
Boris Guéry
Essa resposta não forneceu exatamente o que o OP queria no momento em que postou a pergunta (sem surpresa, já que o que o OP queria era impossível), e suas edições desde então deixaram essa resposta aparentemente totalmente errada, dado o estado atual do questão. Você não pode excluir esta resposta, uma vez que ela é aceita, mas talvez sinalizar para um moderador excluí-la para você? Uma vez que tem mais de 5 votos positivos, você manterá sua reputação.
Mark Amery
0

json_decode ($ jsondata, true);

true transforma todas as propriedades em array (sequencial ou não)

Robert Sinclair
fonte
não se relaciona com a pergunta feita pelo OP. O OP perguntou especificamente o problema de codificação encontrado usandojson_encode
pg2286
como isso não está relacionado? isso mostra um exemplo de uso de json_encode para transformar os dados em um array legível. A pergunta do OP é: "Como posso fazer com que json_encode codifique meu array como um array" meu código faz exatamente isso .. Estou gussing é a palavra "Encode" que está causando o greef? Por 'codificar' ele significa 'se transforma em'. Isso não é motivo para votar negativamente.
Robert Sinclair
oh, entendo o que você quer dizer agora, que você recomendaria algo assim $serialized = json_encode($nonContiguousArray); $unserialize = json_decode($serialized, true); finalmente, finallySerializedInArrayFormat = json_encode($unserialize);se é isso que você está pretendendo, você está certo, mas parecia uma solução um pouco cansativa.
pg2286
-1

Tente isto,

<?php
$arr1=array('result1'=>'abcd','result2'=>'efg'); 
$arr2=array('result1'=>'hijk','result2'=>'lmn'); 
$arr3=array($arr1,$arr2); 
print (json_encode($arr3)); 
?>
Y0Gi
fonte
isso não resolve o problema que o OP está tentando perguntar.
pg2286