Considere estes 2 exemplos ...
$key = 'jim';
// example 1
if (isset($array[$key])) {
// ...
}
// example 2
if (array_key_exists($key, $array)) {
// ...
}
Estou interessado em saber se um deles é melhor. Eu sempre usei o primeiro, mas já vi muitas pessoas usarem o segundo exemplo neste site.
Então, qual é o melhor? Mais rápido? Intenção mais clara?
php
performance
alex
fonte
fonte
isset
nunca se comportará exatamente comoarray_key_exists
no exemplo de código que supostamente o faz se comportar de forma idêntica emite um aviso se a chave não existir.in_array
? maettig.com/1397246220in_array
éO(n)
porque verifica os valores e não as chaves. Eles quase sempre serão mais lentos, a menos que o seun
seja extremamente pequeno.$array[$key] === null
?Respostas:
isset()
é mais rápido, mas não é o mesmo quearray_key_exists()
.array_key_exists()
puramente verifica se a chave existe, mesmo que o valor sejaNULL
.Considerando
isset()
que retornaráfalse
se a chave existir e o valor forNULL
.fonte
isset
não é uma função de pesquisa de matriz, apenas verifica a presença de uma variável na tabela de símbolos e não itera sobre a matriz.array_key_exists
por outro lado, iterará / procurará as chaves na primeira dimensão da matriz especificada.array_key_exists()
que apenas verificará se a chave está na matriz, o que significa que ela não fará uma pesquisa, pois é uma tabela de hash.Se você estiver interessado em alguns testes que fiz recentemente:
https://stackoverflow.com/a/21759158/520857
Resumo:
fonte
Bem, a principal diferença é que
isset()
não retornarátrue
chaves de matriz que correspondam a um valor nulo, enquantoarray_key_exists()
isso ocorre.A execução de um pequeno benchmark mostra que
isset()
é mais rápido, mas pode não ser totalmente preciso.fonte
isset($array[$i]) || $array[$i] === null
não faz sentido, pois retornarátrue
para todos os casos. Você nunca será falso,isset($array[$i]) || $array[$i] === null
independentemente das entradas.Eu queria adicionar meus 2 centavos nessa questão, pois estava faltando uma saída intermediária.
Como já foi dito
isset()
, avaliará o valor da chave, para que ele retornefalse
se esse valor estivernull
ondearray_key_exists()
apenas verificará se a chave existe na matriz.Eu executei uma referência simples usando o PHP 7, os resultados mostrados são o tempo que levou para concluir a iteração:
Adicionei os resultados dessa função personalizada a este benchmark para concluir:
Como visto e já dito,
isset()
é o método mais rápido, mas pode retornar falso se o valor fornull
. Isso pode dar resultados indesejados e, geralmente, deve-array_key_exists()
se usar se for esse o caso.No entanto, existe uma saída intermediária e isso está sendo usado
isset() || array_key_exists()
. Esse código geralmente usa a função mais rápidaisset()
e, seisset()
retornar falso somente, usearray_key_exists()
para validar. Mostrado na tabela acima, é tão rápido quanto chamar claramenteisset()
.Sim, é um pouco mais para escrever e agrupá-lo em uma função é mais lento, mas muito mais fácil. Se você precisar disso para obter desempenho, verifique os big data, etc, escreva-os na íntegra, caso contrário, se o seu uso único for muito pequeno, a sobrecarga na função
array_key_isset()
será insignificante.fonte
Com o Php 7, é possível usar o Operador de coalescência nulo .
Portanto, agora você pode atribuir um valor padrão caso o valor seja nulo ou se a chave não existir:
fonte
existe uma diferença do php.net que você lerá:
Um teste muito informal mostra
array_key_exists()
ser cerca de 2,5 vezes mais lento queisset()
fonte
Combinando
isset()
eis_null()
dar o melhor desempenho em relação a outras funções como:array_key_exists()
,isset()
,isset()
+array_key_exists()
,is_null()
,isset()
+is_null()
, a única questão aqui é a função não só irá retornar false se a chave não existir, mas até mesmo a exist chave e tem um valor nulo.Script de benchmark:
Crédito : http://www.zomeoff.com/php-fast-way-to-determine-a-key-elements-existance-in-an-array/
fonte
Quanto a "mais rápido": experimente (meu dinheiro está ativo
array_key_exists()
, mas não posso fazê-lo agora).Quanto a "mais claro na intenção":
array_key_exists()
fonte
Obviamente, o segundo exemplo é mais claro na intenção, não há dúvida sobre isso. Para descobrir o que o exemplo nº 1 faz, você precisa estar familiarizado com as idiossincrasias de inicialização de variáveis do PHP - e então descobrirá que ele funciona de maneira diferente para valores nulos, e assim por diante.
Quanto ao que é mais rápido - não pretendo especular - corra em um loop apertado algumas centenas de milhares de vezes na sua versão PHP e você descobrirá :)
fonte
Seu código
isset($array[$i]) || $array[$i] === null
retornará verdadeiro em todos os casos, mesmo que a chave não exista (e produza um aviso de índice indefinido). Para o melhor desempenho, o que você deseja éif (isset($array[$key]) || array_key_exists($key,$array)){doWhatIWant();}
fonte
$array[$i] === null
será executado é quando $ i existe na matriz e ter o valor NULL ..