Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Encontrar um valor em um array associativo utilizando apenas uma chave.

Olá, eu gostaria de saber a melhor abordagem para encontrar um valor em um array associativo, utilizando apenas uma determinada key.

Vou passar um pouco do contexto do projeto.

Eu inicialmente pego um documento XML no caso uma NFe de um input do tipo file de uma pagina em HTML e converto em um objeto Javascript.

            let xml = new DOMParser().parseFromString(e.target.result, 'text/xml');
            let json = xmlParaJson(xml);

Apos esse processo eu envio para o meu controller utilizando a API fetch.

 fetch('controller/xxxxxxx.php' , {
                    headers: {'Content-type':'application/json'},
                    method: 'POST',
                    body: JSON.stringify(json)
                });

No controller eu recebo esse json e converto em um array associativo.

$json = json_decode(file_get_contents('php://input'), true);

E caso eu queira um valor determino eu tenho que desencadear uma chamada parecida com isso:

$ide = $form['nfeProc']['NFe']['infNFe']['ide']['dhEmi']['#text'];
echo $ide;

Alguma sugestão de como fazer essa busca de forma mais fácil pois não está me parecendo certo ter que saber todos os campos dentro dessa array para buscar de uma simples informação. Ou mesmo uma sugestão em relação a minha abordagem.

3 respostas
solução!

Olá Felipe,

Nesse caso realmente não fica muito legal quando você vê acessando esse número de arrays dentro de arrays, mas isso vem da estrutura do xml, algo que você não pode mudar.

Acredito que dessa forma que você fez já seja bem próximo do ideal, mesmo com esse $ide = $form[...] bem longo, ainda é bem simples e não passa de uma linha. Assim é fácil de entender esse código mesmo olhando rapidamente.

Mas dependendo do cenário, você pode como alternativa "esconder" esse longo acesso em uma função:

function getIde($form)
{
    return $form['nfeProc']['NFe']['infNFe']['ide']['dhEmi']['#text'];
}

Isso no caso de você acessar essa informação mais de uma vez, mas para um script simples do jeito que você fez já está bom.

Espero ter ajudado, qualquer dúvida pode perguntar.

Agradeço pela resposta. No meu back-end eu realmente não encontrei uma boa forma de fazer a busca no array ('estava escrevendo um algorítimo') , porem eu encontrei uma solução que acho mais elegante.

Em vez de converter o XML para um Objeto e depois converter novamente em uma string com o JSON.stringify(). Eu segui por uma nova abordagem.

Na seguinte linha eu transformo meu arquivo XML em um "Document" que tem acesso aos mesmos métodos que usamos para buscar elementos, em nosso Html. ('Na realidade os dois são o mesmo tipo de objeto DOM')

let xml = new DOMParser().parseFromString(e.target.result, 'text/xml');

Assim sendo caso eu queira buscar um valor elemento especifico no XML eu só tenho que passar os seletores ('Tags do XML') adequados.

xml.querySelector('emit > CNPJ').textContent

O mesmo exemplo que coloquei na minha pergunta porem utilizando a nova abordagem.

xml.querySelector('dhEmi').textContent

Depois só montar um json adequado e enviar para meu controller, a unica desvantagem que vejo nesse método é delegar mais trabalha para o cliente porem eu não vi problemas de performance.

Ótima solução!

Principalmente porque também evita a tripla conversão entre duas linguagens, de XML para JSON para array. Acabou simplificando no js e no PHP.