{"id":183,"date":"2020-12-31T00:52:17","date_gmt":"2020-12-31T00:52:17","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=183"},"modified":"2020-12-31T00:55:43","modified_gmt":"2020-12-31T00:55:43","slug":"php-array-walk-sanitizar-objeto-de-forma-recursiva","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2020\/12\/31\/php-array-walk-sanitizar-objeto-de-forma-recursiva\/","title":{"rendered":"PHP Array Walk Sanitizar Objeto de forma recursiva"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>function sanitizeObject($object): void {\n  array_walk($object, function($value, $key) use($object) {\n    if (is_object($value) || is_array($value)) {\n      self::sanitizeObject($value);\n    }\n\n    if ($value === null\n        || (is_string($value) &amp;&amp; empty($value))\n        || (is_array($value) &amp;&amp; !$value)\n        || (is_object($value) &amp;&amp; !(array)$value)\n    ) {\n      unset($object->{$key});\n    }\n  });\n}<\/code><\/pre>\n\n\n\n<p>Bom pessoal, ao inv\u00e9s de explicar o que este c\u00f3digo faz vou tentar explicar qual era o problema que eu tinha de resolver, acho que dessa forma o artigo far\u00e1 mais sentido pra quem estiver lendo.<\/p>\n\n\n\n<p>Eu estava trabalhando numa integra\u00e7\u00e3o entre sistemas e a API que recebia as informa\u00e7\u00f5es era bastante sens\u00edvel quanto ao conte\u00fado da request. Por exemplo, o comportamento da API poderia variar muito entre eu enviar uma propriedade com conte\u00fado NULL ou ent\u00e3o com a propriedade com conte\u00fado vazio. Em ambos os casos o melhor cen\u00e1rio seria n\u00e3o enviar a propriedade na request.<\/p>\n\n\n\n<p>J\u00e1 no in\u00edcio recebi uma dica de usar o array_filter para eliminar as propriedades nulas ou vazias, como este c\u00f3digo aqui por exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function clearNullFields($metadata) {\n  return (object)array_filter((array)$metadata, static function ($value) {\n    return !(null === $value || trim($value) === '');\n  });\n}<\/code><\/pre>\n\n\n\n<p>O array_filter at\u00e9 poderia resolver a quest\u00e3o, isso se o objeto tivesse um \u00fanico n\u00edvel. Mas n\u00e3o era esse o caso, uma request de API normalmente \u00e9 composta por v\u00e1rios outros objetos em m\u00faltiplos n\u00edveis.<\/p>\n\n\n\n<p>Depois de pesquisar um pouco me deparei com um artigo onde a solu\u00e7\u00e3o era dada por um array_walk. Bingo!<\/p>\n\n\n\n<p>Bastou esta centelha e um pouco de criatividade para adicionar a recursividade fazendo com que todas as propriedades nulas ou vazias fossem sistematicamente removidas com <strong>unset<\/strong>.<\/p>\n\n\n\n<p>At\u00e9 mesmo um objeto mais interno cujas propriedades eram todas nulas ou vazias acabou sendo completamente removido. Isto porque a recursividade resolve as remo\u00e7\u00f5es do n\u00edvel mais baixo para o nivel mais alto.<\/p>\n\n\n\n<p>Assim ap\u00f3s remover todas as propriedades escalares de um objeto, ele mesmo ser\u00e1 um objeto vazio. Consequentemente ao retornar da recursividade inferior o objeto estar\u00e1 vazio e ser\u00e1 removido exatamente por este motivo.<\/p>\n\n\n\n<p>Mas um aviso importante!<\/p>\n\n\n\n<p>O array_walk opera sobre o objeto fornecido alterando suas caracter\u00edsticas originais. Assim para n\u00e3o comprometer nenhum processo que utilizasse o objeto original a solu\u00e7\u00e3o foi criar um objeto totalmente novo para ser sanitizado. Como?<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$sanitize = \\json_decode(\\json_encode($original));\nsanitizeObject($sanitize);<\/code><\/pre>\n\n\n\n<p>Fant\u00e1stico, funciona melhor do que o programado!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bom pessoal, ao inv\u00e9s de explicar o que este c\u00f3digo faz vou tentar explicar qual era o problema que eu tinha de resolver, acho que dessa forma o artigo far\u00e1 mais sentido pra quem estiver lendo. Eu estava trabalhando numa integra\u00e7\u00e3o entre sistemas e a API que recebia as informa\u00e7\u00f5es era bastante sens\u00edvel quanto ao [&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":[85,84,83,87],"class_list":["post-183","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-array_filter","tag-array_walk","tag-oop","tag-recursive"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/183","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=183"}],"version-history":[{"count":2,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/183\/revisions"}],"predecessor-version":[{"id":186,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/183\/revisions\/186"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=183"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=183"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}