{"id":345,"date":"2021-10-05T12:29:05","date_gmt":"2021-10-05T12:29:05","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=345"},"modified":"2021-10-05T12:34:30","modified_gmt":"2021-10-05T12:34:30","slug":"php-array_filter-verificando-se-conteudo-possui-suporte-ao-array_flip","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/10\/05\/php-array_filter-verificando-se-conteudo-possui-suporte-ao-array_flip\/","title":{"rendered":"PHP array_filter Verificando se Conte\u00fado Possui Suporte ao array_flip"},"content":{"rendered":"\n<pre class=\"wp-block-preformatted\">static function hasArrayFlipSupport(array $array): bool {\n   return empty(\n      array_filter(\n         $array,\n         static function ($value, $key) {\n            return (!is_string($value) &amp;&amp; !is_int($value)) || (!is_string($key) &amp;&amp; !is_int($key));\n         },\n         <em>ARRAY_FILTER_USE_BOTH\n      <\/em>)\n   );\n}<\/pre>\n\n\n\n<p>Recentemente estive trabalhando (e ainda estou) num projeto de importa\u00e7\u00e3o de arquivos de dados, uma rotina bastante comum ainda nos dias de hoje apesar de toda a evolu\u00e7\u00e3o tecnol\u00f3gica que temos vivido.<\/p>\n\n\n\n<p>Pois bem, com a elabora\u00e7\u00e3o de classes mais gen\u00e9ricas que devem processar uma variedade quase infinita de possibilidades as coisas se complicam um pouco e precisam de mais rotinas de garantia de funcionalidade.<\/p>\n\n\n\n<p>No meu caso, em um dado momento o uso do <strong>array_flip<\/strong> se mostrou ideal, s\u00f3 precisava inverter o array tornando as valores como chaves e as chaves como valores&#8230; simples n\u00e9? S\u00f3 que n\u00e3o.<\/p>\n\n\n\n<p>O <strong>array_flip<\/strong> somente suporta a opera\u00e7\u00e3o utilizando dados do tipo <strong><em>STRING<\/em><\/strong> e <strong><em>INT<\/em><\/strong>, e essa regra vale para a dupla chave\/valor do array. Lembrando que <strong><em>NULL<\/em><\/strong> tamb\u00e9m n\u00e3o \u00e9 suportado para a opera\u00e7\u00e3o.<\/p>\n\n\n\n<p>Ent\u00e3o eu elaborei este m\u00e9todo para verificar se o conte\u00fado do array suportaria o <strong>array_flip<\/strong>. Basicamente verifica-se o conte\u00fado de todo o array, ambos chave e valor, se eles possuem os tipos de dados suportados.<\/p>\n\n\n\n<p>E foi neste momento que o <strong>array_filter<\/strong> se mostrou parrudo e eficiente. Por padr\u00e3o o <strong>array_filter<\/strong> avalia apenas o valor do elemento.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">array_filter($array, static function($value) { return true; });<\/pre>\n\n\n\n<p>Mas voc\u00ea consegue facilmente mudar este comportamento para avaliar a chave simplesmente adicionando o terceiro par\u00e2metro <strong><em>ARRAY_FILTER_USE_KEY<\/em><\/strong>. <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">array_filter($array, static function($key) { return true; }, ARRAY_FILTER_USE_KEY);<\/pre>\n\n\n\n<p>Mas no meu caso eu precisei mesmo avaliar ambos simultaneamente, assim o trunfo final foi informar o terceiro par\u00e2metro <strong><em>ARRY_FILTER_USE_BOTH<\/em><\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">array_filter($array, static function($value, $key) { return true; }, ARRAY_FILTER_USE_BOTH);<\/pre>\n\n\n\n<p>Observe que, ao acionarmos o uso de ambos chave e valor, a sequ\u00eancia de de entrada da dupla chave\/valor ocorre na ordem inversa valor\/chave. Eu n\u00e3o tenho detalhes para explicar este comportamento, mas acredito que seja para manter uma certa compatibilidade com o uso padr\u00e3o do array_filter, o qual filtra o valor por padr\u00e3o.<\/p>\n\n\n\n<p>Alguns ir\u00e3o dizer que estas caracter\u00edsticas s\u00e3o sinais de aus\u00eancia de padroniza\u00e7\u00e3o e arquitetura no PHP, mas para mim esse \u00e9 o tremendo charme da linguagem!<\/p>\n\n\n\n<p> World Class Technology S2 PHP!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>static function hasArrayFlipSupport(array $array): bool { return empty( array_filter( $array, static function ($value, $key) { return (!is_string($value) &amp;&amp; !is_int($value)) || (!is_string($key) &amp;&amp; !is_int($key)); }, ARRAY_FILTER_USE_BOTH ) ); } Recentemente estive trabalhando (e ainda estou) num projeto de importa\u00e7\u00e3o de arquivos de dados, uma rotina bastante comum ainda nos dias de hoje apesar de toda a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,2,3],"tags":[63,85,162,163,94],"class_list":["post-345","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-array","tag-array_filter","tag-array_filter_use_both","tag-array_filter_use_key","tag-array_flip"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/comments?post=345"}],"version-history":[{"count":2,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/345\/revisions"}],"predecessor-version":[{"id":348,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/345\/revisions\/348"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}