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
- Veja também: stackoverflow.com/questions/2948948/… Você pode escrever uma função de utilidade array_key_exists que funciona recursivamente.
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çãoisset($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"]
.