Verificando a chave existente na matriz multidimensional

Digamos que eu tenha uma estrutura de dados como esta:

array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } } 

Onde “mensagem” e “ação” são opcionais. Para verificar se eles estão presentes, minha primeira tentativa seria escrever algo assim:

if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ } 

Existe uma implementação mais limpa?

Comentários

Resposta

Não, isso é apenas a maneira de fazer isso.

Mesmo quando não estou limitado a uma determinada linguagem de script, não consigo pensar em uma solução mais limpa?

Resposta

Você pode simplesmente fazer isso!

if (isset($array["message"]["action"])) { /*...*/ } 

Prova:

<?php error_reporting(E_ALL); ini_set("error_reporting", E_ALL); ini_set("display_errors", 1); $array = [ "id" => 1, "name" => "foo", "message" => [ "action" => "PUT", ], ]; var_dump(isset($array["message"]["action"])); // true $array = [ "id" => 1, "name" => "foo" ]; var_dump(isset($array["message"]["action"])); // false 

Nenhuma entrada de registro.

Observe que, se seu valor é null, então isset também retornará falso. Você provavelmente não deveria criar valores com null.

Comentários

  • Esta resposta também está sem um ) e pode fazer com que uma entrada de registro seja gerada devido à não verificação isset($array['message']) antes de desreferenciá-lo.
  • @Brythan no, não causa uma entrada de log. Mas sim, está faltando um ).
  • Desculpe, eu quis dizer que você ' d tem que acione seu relatório de erros. Isso absolutamente causa uma entrada de log se você tiver definido o relatório de erros para ele. Eu ' já enviei spam para meus registros com isso anteriormente. Este era o registro padrão em um ponto. Pode não ser o padrão agora (ou seu host pode ter desativado o relatório de erros), mas estou absolutamente certo de que essa situação pode gerar uma entrada de registro em certas configurações.
  • Não, realmente não ' t Eu testei com todos os relatórios de erros ativados!

Resposta

Não é mais claro, mas provavelmente a solução mais rápida:

if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ } 

A segunda verificação é necessária porque alguns valores avaliados com isset() resultará em falso, embora o índice exista.

Resposta

Estou usando isso em um projeto meu, mas eu ” m usando null como um estado mudo. (php 5.6)

<?php function &option_select($options, $default, ...$path) { if(!isset($path[0])) { return $options; } $cursor = &$options; foreach($path as $key) { if(isset($cursor[$key])) { $cursor = &$cursor[$key]; } else { return $default; } } return $cursor; } 

É uma função que pesquisará um path em uma árvore.

echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C"); 

Como você pode ver. Estou repetindo os valores em uma matriz: path. No início, estou definindo um cursor como referência a uma matriz que tenho que pesquisar. Cada vez que encontro uma chave new, estou definindo a referência do cursor para o a chave atual que estou procurando. Se você tiver xdebug e uma boa GUI, poderá regravá-la com o algoritmo que desejar. É o isset($cursor[$key]) você tem que mudar. Ou injete-o como uma função: f($cursor, $key, $default) => (bool)

Comentários

  • Você forneceu uma solução alternativa, mas forneceu não reviu o código. Por favor, adicione explicação sobre por que esta seria uma solução melhor para o OP, ao invés do que eles já têm.
  • Porque não é ' t SirPython fortemente tipado. Desta forma, posso testá-lo com testes de unidade, sem fazer um teste de unidade para cada ' string codificada '. O mesmo acontece com a testabilidade e a velocidade em que posso criar código funcional.

Resposta

Estou procurando um semelhante solução sozinho e veio com isso. Trabalha para determinar se a chave está definida – e retornará TRUE mesmo se o valor da chave “action” for NULL.

if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ } 

Se $array["message"] não tem chaves, o isset retornará FALSO interrompendo a instrução IF. Se $array["message"] tiver alguma chave – mesmo aquelas com valores NULL – isset retornará TRUE, permitindo que você verifique com segurança se "action" a chave da matriz existe em $array["message"].

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *