isset () vs. array_key_exists ()

Na maior parte da minha carreira em PHP, costumava isset()determinar se um array tem uma determinada chave.

$foo = array();
echo isset
($foo['bar']) ? 'set' : 'not set'; // Prints: not set

isset() é bom porque você também pode usá-lo em variáveis ​​regulares e propriedades de objeto.

unset($foo);
echo isset
($foo) ? 'set' : 'not set'; // Prints: not set

$foo
= new StdClass();
echo isset
($foo->bar) ? 'set' : 'not set'; // Prints: not set

Em algum lugar ao longo do caminho, aprendi que havia uma array_key_exists()função, mas naquela época digitar isset()já era uma memória muscular. Nunca me preocupei com array_key_exists()até recentemente, quando me deparei com uma situação em que realmente precisava. Eu queria construir um serviço REST com o seguinte comportamento PUT (editar / atualizar):

  • Se você incluir uma chave e configurá-la com um valor, a chave será atualizada com o valor.
  • Se você incluir uma chave e defini-la como nula, a chave será atualizada e seu valor será definido como nulo.
  • Se você COLOCAR algum JSON e omitir uma chave, essa chave será ignorada e nenhuma atualização será feita nela.

Os primeiros dois pontos são bastante óbvios, mas o terceiro não é. Você pode argumentar que esse comportamento não é muito RESTful, mas impede o envio de blocos de dados redundantes por meio de um link móvel.

Enfim, de volta para e . Apesar do nome, verifica realmente se o argumento está definido e não é nulo . Portanto, se você tiver uma matriz com uma chave cujo valor é nulo, a chamada dessa chave retornará .isset()array_key_exists()isset()isset()false

$foo = array(
'bar' => null,
);

// Prints: "not set" because $foo['bar'] is null
echo isset
($foo['bar']) ? 'set' : 'not set';

No meu serviço, eu não conseguia distinguir entre o segundo e o terceiro casos de uso – o cliente definindo uma chave como nula versus omitindo a chave inteiramente. A solução foi usar o que apenas verifica se o array possui a chave.array_key_exists()

$foo = array(
'bar' => null,
);

// Prints: "exists" because $foo['bar'] exists, even if it is null
echo array_key_exists
('bar', $foo) ? 'exists' : 'does not exist';

Considerações de desempenho

Me deparei com um post esta manhã falando sobre o desempenho do vs. . (Isso é o que me lembrou de escrever esta postagem do blog, na verdade.) A conclusão é que isso é na verdade mais rápido do que porque na verdade é uma construção de linguagem, não uma função, portanto, não incorre em sobrecarga de chamada de função. Mas ambos são bastante rápidos, então você provavelmente não deve escolher um em vez do outro por motivos de desempenho.isset()array_key_exists()isset()array_key_exists()isset()

Esta dica foi republicada do meu blog, jontai.me