static function hasArrayFlipSupport(array $array): bool {
return empty(
array_filter(
$array,
static function ($value, $key) {
return (!is_string($value) && !is_int($value)) || (!is_string($key) && !is_int($key));
},
ARRAY_FILTER_USE_BOTH
)
);
}
Recentemente estive trabalhando (e ainda estou) num projeto de importação de arquivos de dados, uma rotina bastante comum ainda nos dias de hoje apesar de toda a evolução tecnológica que temos vivido.
Pois bem, com a elaboração de classes mais genéricas que devem processar uma variedade quase infinita de possibilidades as coisas se complicam um pouco e precisam de mais rotinas de garantia de funcionalidade.
No meu caso, em um dado momento o uso do array_flip se mostrou ideal, só precisava inverter o array tornando as valores como chaves e as chaves como valores… simples né? Só que não.
O array_flip somente suporta a operação utilizando dados do tipo STRING e INT, e essa regra vale para a dupla chave/valor do array. Lembrando que NULL também não é suportado para a operação.
Então eu elaborei este método para verificar se o conteúdo do array suportaria o array_flip. Basicamente verifica-se o conteúdo de todo o array, ambos chave e valor, se eles possuem os tipos de dados suportados.
E foi neste momento que o array_filter se mostrou parrudo e eficiente. Por padrão o array_filter avalia apenas o valor do elemento.
array_filter($array, static function($value) { return true; });
Mas você consegue facilmente mudar este comportamento para avaliar a chave simplesmente adicionando o terceiro parâmetro ARRAY_FILTER_USE_KEY.
array_filter($array, static function($key) { return true; }, ARRAY_FILTER_USE_KEY);
Mas no meu caso eu precisei mesmo avaliar ambos simultaneamente, assim o trunfo final foi informar o terceiro parâmetro ARRY_FILTER_USE_BOTH.
array_filter($array, static function($value, $key) { return true; }, ARRAY_FILTER_USE_BOTH);
Observe que, ao acionarmos o uso de ambos chave e valor, a sequência de de entrada da dupla chave/valor ocorre na ordem inversa valor/chave. Eu não tenho detalhes para explicar este comportamento, mas acredito que seja para manter uma certa compatibilidade com o uso padrão do array_filter, o qual filtra o valor por padrão.
Alguns irão dizer que estas características são sinais de ausência de padronização e arquitetura no PHP, mas para mim esse é o tremendo charme da linguagem!
World Class Technology S2 PHP!