Estou usando json_decode()
algo como:
$myVar = json_decode($data)
O que me dá uma saída como esta:
[highlighting] => stdClass Object
(
[448364] => stdClass Object
(
[Data] => Array
(
[0] => Tax amount liability is .......
Desejo acessar o valor da string na chave [0]. Quando tento fazer algo como:
print $myVar->highlighting->448364->Data->0;
Eu recebo este erro:
Erro de análise: erro de sintaxe, T_DNUMBER inesperado
Os dois algarismos / inteiros parece haver problema.
php
object
properties
Avinash Shah
fonte
fonte
Respostas:
Atualizado para PHP 7.2
O PHP 7.2 introduziu uma mudança comportamental para converter chaves numéricas em object e array casts , que corrige esta inconsistência em particular e faz com que todos os exemplos a seguir se comportem como esperado.
Uma coisa a menos para se confundir!
Resposta original (aplica-se a versões anteriores a 7.2.0)
PHP tem sua cota de becos sombrios nos quais você realmente não quer se encontrar. Propriedades de objeto com nomes que são números é um deles ...
O que eles nunca te disseram
Fato nº 1: você não pode acessar propriedades com nomes que não sejam nomes de variáveis legais facilmente
Fato nº 2: você pode acessar essas propriedades com a sintaxe de chaves
Fato nº 3: mas não se o nome da propriedade tiver apenas dígitos!
Exemplo ao vivo .
Fato # 4: Bem, a menos que o objeto não venha de um array em primeiro lugar.
Exemplo ao vivo .
Muito intuitivo, não concorda?
O que você pode fazer
Opção nº 1: faça manualmente
A abordagem mais prática é simplesmente converter o objeto no qual você está interessado de volta em uma matriz, o que permitirá que você acesse as propriedades:
Infelizmente, isso não funciona recursivamente. Portanto, no seu caso, você precisaria fazer algo como:
Opção 2: a opção nuclear
Uma abordagem alternativa seria escrever uma função que converte objetos em matrizes recursivamente:
No entanto, não estou convencido de que essa seja a melhor opção em todos os aspectos, porque ela lançará em matrizes desnecessariamente todas as propriedades nas quais você não está interessado, assim como aquelas em que você está.
Opção nº 3: jogar com inteligência
Uma alternativa à opção anterior é usar as funções JSON integradas:
As funções JSON realizam de forma útil uma conversão recursiva em array sem a necessidade de definir quaisquer funções externas. Por mais desejável que pareça, ele tem a desvantagem "nuke" da opção # 2 e, adicionalmente, a desvantagem de que se houver qualquer string dentro do seu objeto, essas strings devem ser codificadas em UTF-8 (este é um requisito de
json_encode
).fonte
->date
ou->timezone
, somentenull
será retornado. Percebi que se var_dumped o objeto antes de usar essas propriedades, os valores apropriados são retornados. A clonagem não corrige isso, então acho que realmente tem a ver com o acesso quevar_dump
faz ... Então eu vi sua Opção # 1 e voilá, acessando-a como um array ($objCastAsArray['date']
) funcionou perfeitamente.$o = unserialize('O:8:"StdClass"' . substr(serialize($a),1));
Só queria acrescentar à eloqüente explicação de Jon o motivo do fracasso. Tudo porque, ao criar um array, o php converte as chaves em inteiros - se puder - o que causa problemas de pesquisa em arrays que foram convertidos em objetos, simplesmente porque a chave numérica é preservada. Isso é problemático porque todas as opções de acesso de propriedade esperam ou são convertidas em strings. Você pode confirmar isso fazendo o seguinte:
O que resultaria em:
Portanto, o objeto tem duas chaves de propriedade, uma numérica (que não pode ser acessada) e uma baseada em string. Esta é a razão pela qual Jon's
#Fact 4
funciona, porque definir a propriedade usando chaves significa que você sempre define uma chave baseada em string, em vez de numérica.Pegando a solução de Jon, mas virando-a de cabeça para baixo, você pode gerar um objeto de sua matriz que sempre tem chaves baseadas em string, fazendo o seguinte:
De agora em diante, você pode usar qualquer um dos seguintes porque o acesso dessa maneira sempre converte o valor dentro da chave em uma string:
O bom e velho PHP ilógico ...
fonte
Se um objeto começa com
@
:Você tem que usar:
porque
$parent_object->{'@attributes'}
ou$parent_object['@attributes']
não vai funcionar.fonte
Copiei esta função da rede. Se funcionar como diz ("Função para converter objetos stdClass em matrizes multidimensionais"), tente o seguinte:
objectToArray
funcionar[highlighting][448364][Data][0]
Fonte: PHP stdClass para Array e Array para stdClass
fonte
Uma alternativa final para a resposta abrangente de Jon:
Simplesmente use json_decode () com o segundo parâmetro definido como verdadeiro .
Isso então retorna uma matriz associativa em vez de um objeto, portanto, não há necessidade de converter após o fato.
Isso pode não ser adequado para todos os aplicativos, mas realmente me ajudou a referenciar facilmente uma propriedade do objeto original.
A solução foi encontrada neste tutorial - http://nitschinger.at/Handling-JSON-like-a-boss-in-PHP/
Saudações
fonte
Acessando propriedades do objeto tendo números como nome da propriedade. Principalmente necessário após o lançamento da matriz para o objeto.
fonte
Infelizmente, você não tem permissão para nomear objetos que começam com números. Renomeie o primeiro "448364" começando com uma letra.
O segundo é uma matriz, que deve ser acessada por colchetes como:
em vez de
fonte