Surpreendentemente array_keys_exist
não existe ?! Nesse ínterim, isso deixa algum espaço para descobrir uma expressão de linha única para essa tarefa comum. Estou pensando em um script de shell ou outro pequeno programa.
Nota: cada uma das seguintes soluções usa […]
sintaxe concisa de declaração de array disponível no php 5.4+
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
(gorjeta para Kim Stacks )
Essa abordagem é a mais breve que encontrei. array_diff()
retorna uma matriz de itens presentes no argumento 1 não presentes no argumento2. Portanto, uma matriz vazia indica que todas as chaves foram encontradas. No php 5.5 você pode simplificar 0 === count(…)
para ser simples empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
} else {
}
Mais difícil de ler, fácil de mudar. array_reduce()
usa um retorno de chamada para iterar em uma matriz para chegar a um valor. Ao alimentar as chaves, estamos interessados no $initial
valor de $in
e, em seguida, remover as chaves encontradas na origem, podemos esperar terminar com 0 elementos se todas as chaves forem encontradas.
A construção é fácil de modificar, pois as teclas em que estamos interessados se encaixam perfeitamente no resultado final.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Mais simples de escrever do que a array_reduce
solução, mas um pouco mais complicada de editar. array_filter
também é um retorno de chamada iterativo que permite criar uma matriz filtrada retornando verdadeiro (copiar o item para a nova matriz) ou falso (não copiar) no retorno de chamada. O ponto principal é que você deve alterar 2
o número de itens que espera.
Isso pode ser mais durável, mas chega a uma legibilidade absurda:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}