PHP array_filter Verificando se Conteúdo Possui Suporte ao array_flip

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!

Deixe um comentário