A função de retorno de chamada array_filter()
passa apenas os valores da matriz, não as chaves.
Se eu tiver:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Qual é a melhor maneira de excluir todas as chaves $my_array
que não estão na $allowed
matriz?
Saída desejada:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
Isto irá resultar em$b['bar']
sejanull
.Respostas:
O PHP 5.6 introduziu um terceiro parâmetro para
array_filter()
,flag
que você pode definirARRAY_FILTER_USE_KEY
para filtrar por chave em vez de valor:Claramente, isso não é tão elegante quanto
array_intersect_key($my_array, array_flip($allowed))
, mas oferece a flexibilidade adicional de executar um teste arbitrário contra a chave; por exemplo,$allowed
pode conter padrões regex em vez de strings simples.Você também pode usar
ARRAY_FILTER_USE_BOTH
para passar o valor e a chave para a função de filtro. Aqui está um exemplo artificial baseado no primeiro, mas observe que eu não recomendaria a codificação de regras de filtragem$allowed
dessa maneira:fonte
array_intersect
Com
array_intersect_key
earray_flip
:fonte
array_flip
? Basta definir as$allowed
teclas com:allowed = array ( 'foo' => 1, 'bar' => 1 );
Eu precisava fazer o mesmo, mas com mais complexidade
array_filter
nas teclas.Aqui está como eu fiz isso, usando um método semelhante.
Isso gera o resultado:
fonte
Aqui está uma solução mais flexível usando um fechamento:
Saídas:
Portanto, na função, você pode fazer outros testes específicos.
fonte
Se você estiver procurando por um método para filtrar uma matriz por uma sequência que ocorre nas chaves, você pode usar:
O resultado de
print_r($mResult)
éUma adaptação desta resposta que suporta expressões regulares
Resultado
fonte
stristr
dentro do "trabalho" da função está fazendo algumas suposições para o usuário final. Talvez seja melhor permitir que o usuário passe uma expressão regular; isso lhes daria mais flexibilidade sobre certas coisas, como âncoras, limites de palavra, e maiúsculas e minúsculas, etc.Como obter a chave atual de uma matriz ao usar
array_filter
Independentemente de como eu goste da solução de Vincent para o problema de Maček, ele não é realmente usado
array_filter
. Se você veio aqui de um mecanismo de pesquisa, talvez esteja procurando algo parecido com este ( PHP> = 5.3 ):Ele passa a matriz que você está filtrando como uma referência ao retorno de chamada. Como
array_filter
não itera convencionalmente sobre a matriz, aumentando o ponteiro público interno, você precisa avançar por si mesmo.O importante aqui é que você precisa garantir que sua matriz seja redefinida, caso contrário, você poderá começar bem no meio dela.
No PHP> = 5.4, você poderia reduzir ainda mais o retorno de chamada:
fonte
Aqui está uma alternativa menos flexível usando unset () :
O resultado de
print_r($array)
ser:Isso não é aplicável se você deseja manter os valores filtrados para uso posterior, mas mais organizado, se tiver certeza de que não.
fonte
unset()
. Nenhum aviso será emitido se a chave não existir.A partir do PHP 5.6, você pode usar o
ARRAY_FILTER_USE_KEY
sinalizador emarray_filter
:Caso contrário, você pode usar esta função ( do TestDummy ):
E aqui está uma versão aumentada da minha, que aceita um retorno de chamada ou diretamente as chaves:
Por último, mas não menos importante, você também pode usar um simples
foreach
:fonte
Talvez seja um exagero, se você precisar apenas uma vez, mas pode usar a biblioteca do YaLinqo * para filtrar coleções (e executar outras transformações). Essa biblioteca permite realizar consultas semelhantes a SQL em objetos com sintaxe fluente. Sua
where
função aceita um calback com dois argumentos: um valor e uma chave. Por exemplo:(A
where
função retorna um iterador, portanto, se você precisar iterar comforeach
a sequência resultante uma vez,->toArray()
poderá ser removido.)* desenvolvido por mim
fonte
função de filtro de matriz do php:
$ array - É o array de entrada
$ callback_function - A função de retorno de chamada a ser usada , Se a função de retorno de chamada retornar verdadeiro , o valor atual da matriz será retornado para a matriz de resultados.
$ flag - É um parâmetro opcional , determinará quais argumentos serão enviados para a função de retorno de chamada. Se esse parâmetro estiver vazio, a função de retorno de chamada assumirá os valores da matriz como argumento. Se você deseja enviar a chave da matriz como argumento, use $ flag como ARRAY_FILTER_USE_KEY . Se você deseja enviar chaves e valores, use $ flag como ARRAY_FILTER_USE_BOTH .
Por exemplo: considere uma matriz simples
Se você deseja filtrar a matriz com base na chave da matriz , precisamos usar ARRAY_FILTER_USE_KEY como terceiro parâmetro da função da matriz array_filter.
Se você deseja filtrar a matriz com base na chave e no valor da matriz , precisamos usar ARRAY_FILTER_USE_BOTH como terceiro parâmetro da função da matriz array_filter.
Funções de amostra de retorno de chamada:
Vai sair
fonte
Com esta função, você pode filtrar uma matriz multidimensional
fonte
fonte
Solução ingênua e feia (mas parece ser mais rápida)?
Só tentei isso no php 7.3.11, mas um loop feio parece ser executado em cerca de um terço do tempo. Resultados semelhantes em uma matriz com algumas centenas de chaves. Micro-otimização, provavelmente não útil em RW, mas achou surpreendente e interessante:
fonte
fonte