{"id":203,"date":"2021-04-03T01:20:00","date_gmt":"2021-04-03T01:20:00","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=203"},"modified":"2021-04-03T15:51:13","modified_gmt":"2021-04-03T15:51:13","slug":"php-array-entenda-como-obter-vantagens-com-as-funcoes-array-prontas","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/04\/03\/php-array-entenda-como-obter-vantagens-com-as-funcoes-array-prontas\/","title":{"rendered":"PHP Array Entenda como Obter Vantagens com as Fun\u00e7\u00f5es Array Prontas"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>function bestProducts($products, $sales): array {\n  $ySalesProducts = explode(' ', $sales);\n\n  $yFiltered = array_filter(\n    $ySalesProducts,\n    function ($item) use ($products) {\n      return in_array($item, $products, true);\n    });\n \n  $yCount = array_count_values($yFiltered);\n  arsort($yCount);\n  $ySlice = array_slice($yCount, 0, 2);\n  &#91;$first, $second] = array_values($ySlice);\n\n  ($first === $second)\n    ? ksort($ySlice)\n    : null;\n\n    return $ySlice;\n}\n\n$products = &#91; 'phone', 'mobile', 'game', 'headset', 'hdd', 'ssd' ];\n$context = 'phone ssd headset ssd headset mobile headset phone game headset hdd ssd game ssd ssd headset game box box box box box box';\n\n$result = bestProducts($products, $context);\nvar_dump($result);<\/code><\/pre>\n\n\n\n<p>H\u00e1 algum tempo eu estava num desafio de codifica\u00e7\u00e3o na Plataforma Hacker Rank e apareceu uma quest\u00e3o que usava muitos recursos de ARRAY&#8230; pensei comigo, t\u00e1 no papo! S\u00f3 que n\u00e3o&#8230;<\/p>\n\n\n\n<p>Meu principal erro n\u00e3o foi subestimar o problema, mas sim subestimar a memoriza\u00e7\u00e3o das fun\u00e7\u00f5es array e o porqu\u00ea delas existirem. Como de costume, eu sempre recorro as documenta\u00e7\u00f5es do PHP.net quando estou programando, s\u00f3 que durante uma maratona ou num desafio de programa\u00e7\u00e3o ter estas funcionalidades prontamente memorizadas faz uma tremenda falta.<\/p>\n\n\n\n<p>Churumelas postas, vamos ao enunciado do problema.<\/p>\n\n\n\n<p><em>Dada uma lista de produtos ($products) previamente definida, contabilize a quantidade vendida de cada produto dada uma listagem de produtos vendidos ($context). Somente os produtos constantes na lista previamente definida devem ser contabilizados. Ao final selecione apenas os dois produtos mais vendidos, e caso haja um empate classifique os produtos em ordem alfab\u00e9tica. O retorno deve ser um array associativo produto x quantidade.<\/em><\/p>\n\n\n\n<p>Observando o enunciado podemos perceber alguns recursos que ser\u00e3o necess\u00e1rios&#8230; explode para transformar a lista de produtos vendidos em array, array_filter para excluir quem n\u00e3o est\u00e1 na listagem de produtos pr\u00e9-definidos, count para contar, sort para classificar, array_shift para pegar os produtos mais vendidos&#8230;<\/p>\n\n\n\n<p>Podemos parar por aqui, boa parte destes recursos v\u00e3o dar na trave, sabe por que? Porque provavelmente voc\u00ea n\u00e3o lembraria de cabe\u00e7a a diferen\u00e7a entre sort, rsort, asort, arsort, ksort, krsort, usort, uasort, uksort&#8230; Talvez voc\u00ea tamb\u00e9m n\u00e3o lembre algumas fun\u00e7\u00f5es prontas utilizam exclusivamente \u00edndices num\u00e9ricos e\/ou n\u00e3o preservam os \u00edndices originais associativos. Outra grande quest\u00e3o \u00e9 a aplica\u00e7\u00e3o em arrays multi-n\u00edveis, uma coisa \u00e9 trabalhar com array simples de um \u00fanico n\u00edvel e outra coisa processar array multi-n\u00edvel em profundidade.<\/p>\n\n\n\n<p>Assim, eu n\u00e3o vou tentar explicar o algoritmo do problema pra voc\u00eas; ele \u00e9 muito simples depois de resolvido e pode facilmente ser entendido apenas voc\u00ea lendo o c\u00f3digo. Conforme o enunciado tamb\u00e9m podemos perceber que os arrays aplicados s\u00e3o de n\u00edvel simples onde as fun\u00e7\u00f5es array prontas d\u00e3o um show. Ent\u00e3o eu vou explicar a seguir o que voc\u00ea deveria ter mente ou ter decorado sobre algumas fun\u00e7\u00f5es array prontas, por que esse \u00e9 o verdadeiro diferencial que voc\u00ea pode obter.<\/p>\n\n\n\n<p><strong>SORT<\/strong> &#8211; sort ordena um array pelo valor do elemento, mas ele despreza completamente os \u00edndices originais do array. Sort opera sobre o array original modificando-o completamente, assim bye bye array original depois do sort. Ent\u00e3o sort n\u00e3o serve pra voc\u00ea se voc\u00ea precisa manter os \u00edndices associativos preservados depois da ordena\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = (&#91;'fruit'=&gt;'lemon','salad'=&gt;'lettuce','protein'=&gt;'eggs','carbohydrate'=&gt;'pasta']);\nsort($y);\nprint_r($y);\n\/\/ &#91;0] =&gt; eggs\n\/\/ &#91;1] =&gt; lemon\n\/\/ &#91;2] =&gt; lettuce\n\/\/ &#91;3] =&gt; pasta<\/code><\/pre>\n\n\n\n<p><strong>RSORT<\/strong> &#8211; o mesmo que sort, s\u00f3 que ordena em ordem inversa. Repare que o R a frente de sort significa REVERSE. Lembre-se deste R a frente do sort, ele vai aparecer em outros comandos e ter\u00e1 a mesma sem\u00e2ntica.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'fruit'=&gt;'lemon','salad'=&gt;'lettuce','protein'=&gt;'eggs','carbohydrate'=&gt;'pasta'];\nrsort($y);\nprint_r($y);\n\/\/ &#91;0] =&gt; pasta\n\/\/ &#91;1] =&gt; lettuce\n\/\/ &#91;2] =&gt; lemon\n\/\/ &#91;3] =&gt; eggs<\/code><\/pre>\n\n\n\n<p><strong>ASORT<\/strong> &#8211; o mesmo que sort, s\u00f3 que este aqui preserva os \u00edndices originais intactos. Repare que o A a frente de sort significa ASSOCIATIVE, indicando que o comando aplica-se a opera\u00e7\u00f5es com arrays associativos. Os \u00edndices num\u00e9ricos tamb\u00e9m ser\u00e3o preservados ap\u00f3s a ordena\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = (&#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta']);\nasort($y);\nprint_r($y);\n\/\/ &#91;1] =&gt; beans\n\/\/ &#91;3] =&gt; bread\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;0] =&gt; rice<\/code><\/pre>\n\n\n\n<p><strong>ARSORT<\/strong> &#8211; o mesmo que asort s\u00f3 que a ordena\u00e7\u00e3o \u00e9 feita em ordem inversa. Repare novamente o R antes do sort indica REVERSE ou seja, ordem inversa. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = (&#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta']);\narsort($y);\nprint_r($y);\n\/\/ &#91;0] =&gt; rice\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;3] =&gt; bread\n\/\/ &#91;1] =&gt; beans<\/code><\/pre>\n\n\n\n<p><strong>KSORT<\/strong> &#8211; ordena um array pelo \u00edndice e n\u00e3o pelo valor do elemento como faz o sort. Repare que K a frente do sort significa KEY. Aqui nos deparamos com uma primeira situa\u00e7\u00e3o inusitada, como \u00e9 comum termos \u00edndices mistos compostos por n\u00fameros e strings o tipo de ordena\u00e7\u00e3o padr\u00e3o pode n\u00e3o atender as nossas expectativas. Para corrigir este comportamento basta ativar o segundo par\u00e2metro informando SORT_STRING ou SORT_NATURAL, isso deve resolver a quest\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta'];\nksort($y);\nprint_r($y);\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;0] =&gt; rice\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;1] =&gt; beans\n\/\/ &#91;3] =&gt; bread\n\n$y = &#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta'];\nksort($y, SORT_STRING);\nprint_r($y);\n\/\/ &#91;0] =&gt; rice\n\/\/ &#91;1] =&gt; beans\n\/\/ &#91;3] =&gt; bread\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;salad] =&gt; lettuce<\/code><\/pre>\n\n\n\n<p><strong>KRSORT<\/strong> &#8211; o mesmo que ksort s\u00f3 que ordenado em ordem inversa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta'];\nkrsort($y, SORT_NATURAL);\nprint_r($y);\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;3] =&gt; bread\n\/\/ &#91;1] =&gt; beans\n\/\/ &#91;0] =&gt; rice<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_SLICE<\/strong> &#8211; esse aqui \u00e9 animal, se voc\u00ea precisa quebrar um array em peda\u00e7os, sacar a ponta da frente ou at\u00e9 mesmo a ponta de tr\u00e1s  do array, mas precisa que esta quebra preserve a combina\u00e7\u00e3o key =&gt; value do array original?! array_slice \u00e9 a sua pedida.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta'];\nkrsort($y, SORT_STRING);\nprint_r($y);\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;fruit] =&gt; lemon\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;3] =&gt; bread\n\/\/ &#91;1] =&gt; beans\n\/\/ &#91;0] =&gt; rice\n\n$ys = array_slice($y, 0, 2);\nprint_r($ys);\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;protein] =&gt; eggs<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_PUSH<\/strong> &#8211; <strong>ARRAY_POP<\/strong> &#8211; <strong>ARRAY_SHIFT<\/strong> &#8211; <strong>ARRAY_UNSHIFT<\/strong> &#8211; Lembre-se que estas fun\u00e7\u00f5es n\u00e3o objetivam trabalhar com \u00edndices associativos ent\u00e3o nenhuma destas fun\u00e7\u00f5es servir\u00e3o para o nosso caso. Todos esses quatro comandos operam em n\u00edvel de elemento valor sem se importar com \u00edndices. A cada intera\u00e7\u00e3o por estes comandos os \u00edndices do array s\u00e3o sistematicamente resequenciados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;];\narray_push($y, 'first');\narray_push($y, 'second');\narray_push($y, 'third');\nprint_r($y);\n\/\/ &#91;0] =&gt; first\n\/\/ &#91;1] =&gt; second\n\/\/ &#91;2] =&gt; third\n$ys = array_shift($y);\nprint_r($ys);\n\/\/ first\narray_unshift($y, 'zero');\nprint_r($y);\n\/\/ &#91;0] =&gt; zero\n\/\/ &#91;1] =&gt; second\n\/\/ &#91;2] =&gt; third\n$yp = array_pop($y);\nprint_r($yp);\n\/\/ third\nprint_r($y);\n\/\/ &#91;0] =&gt; zero\n\/\/ &#91;1] =&gt; second<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_COUNT_VALUES<\/strong> &#8211; fant\u00e1stico recurso para contabilizar as ocorr\u00eancias dos valores em um array. Pense no array de produtos vendidos, usando array_count_values teremos como retorno um array tendo os produtos como chave e as ocorr\u00eancias de cada produto sumarizadas como valor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$c = 'phone ssd headset ssd headset mobile headset phone game headset hdd ssd game ssd ssd headset game box box box box box box';\n$y = explode(' ', $c);\nprint_r($y);\n\/\/ &#91;0] =&gt; phone              \/\/ &#91;12] =&gt; game\n\/\/ &#91;1] =&gt; ssd                \/\/ &#91;13] =&gt; ssd\n\/\/ &#91;2] =&gt; headset            \/\/ &#91;14] =&gt; ssd\n\/\/ &#91;3] =&gt; ssd                \/\/ &#91;15] =&gt; headset\n\/\/ &#91;4] =&gt; headset            \/\/ &#91;16] =&gt; game   \n\/\/ &#91;5] =&gt; mobile             \/\/ &#91;17] =&gt; box\n\/\/ &#91;6] =&gt; headset            \/\/ &#91;18] =&gt; box\n\/\/ &#91;7] =&gt; phone              \/\/ &#91;19] =&gt; box\n\/\/ &#91;8] =&gt; game               \/\/ &#91;20] =&gt; box\n\/\/ &#91;9] =&gt; headset            \/\/ &#91;21] =&gt; box\n\/\/ &#91;10] =&gt; hdd               \/\/ &#91;22] =&gt; box\n\/\/ &#91;11] =&gt; ssd\n\n$yc = array_count_values($y);\nprint_r($yc);\n\/\/ &#91;phone] =&gt; 2\n\/\/ &#91;ssd] =&gt; 5\n\/\/ &#91;headset] =&gt; 5\n\/\/ &#91;mobile] =&gt; 1\n\/\/ &#91;game] =&gt; 3\n\/\/ &#91;hdd] =&gt; 1\n\/\/ &#91;box] =&gt; 6<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_KEYS<\/strong> &#8211; retorna os \u00edndices de um array como um array de valores. Este novo array retornado ser\u00e1 chaveado por \u00edndice num\u00e9rico sequencial.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'phone'=&gt;2,'ssd'=&gt;5,'headset'=&gt;5,'mobile'=&gt;1,'game'=&gt;3,'hdd'=&gt;1,'box'=&gt;6];\n$yk = array_keys($y);\nprint_r($yk);\n\/\/ &#91;0] =&gt; phone\n\/\/ &#91;1] =&gt; ssd\n\/\/ &#91;2] =&gt; headset\n\/\/ &#91;3] =&gt; mobile\n\/\/ &#91;4] =&gt; game\n\/\/ &#91;5] =&gt; hdd\n\/\/ &#91;6] =&gt; box<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_VALUES<\/strong> &#8211; retorna os valores de um array como um array de valores desprezando os \u00edndices originais. O novo array ser\u00e1 chaveado por \u00edndice num\u00e9rico sequencial. O array_values trabalha apenas com um n\u00edvel de array, assim arrays com multi-n\u00edveis contendo outros arrays ou objetos ser\u00e3o processados no seu primeiro n\u00edvel, mas estes subarrays e objetos permanecer\u00e3o intactos em sua estrutura. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'phone'=&gt;2,'ssd'=&gt;5,'headset'=&gt;5,'mobile'=&gt;1,'game'=&gt;3,'hdd'=&gt;1,'box'=&gt;6,'sub'=&gt; &#91;'ps5'=&gt;10]];\n$yv = array_values($y);\nprint_r($yv);\n\/\/ &#91;0] =&gt; 2\n\/\/ &#91;1] =&gt; 5\n\/\/ &#91;2] =&gt; 5\n\/\/ &#91;3] =&gt; 1\n\/\/ &#91;4] =&gt; 3\n\/\/ &#91;5] =&gt; 1\n\/\/ &#91;6] =&gt; 6\n\/\/ &#91;7] =&gt; Array\n\/\/ (\n\/\/   &#91;ps5] =&gt; 10\n\/\/ )<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_FLIP<\/strong> &#8211; inverte a posi\u00e7\u00e3o de \u00edndices e valores, ou seja, os valores passam a ser \u00edndices e os \u00edndices passam a ser valores. Mas o array_flip trabalha somente com arrays simples com \u00edndices e valores do tipo string e\/ou num\u00e9rico. Caso seu array contenha um outro array ou um objeto o array flip vai emitir um warning mas ainda assim vai funcionar, por\u00e9m os subarrays e objetos ser\u00e3o ignorados e n\u00e3o far\u00e3o parte da nova array retornada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'phone'=&gt;2,'ssd'=&gt;5,'headset'=&gt;5,'mobile'=&gt;1,'game'=&gt;3,'hdd'=&gt;1,'box'=&gt;6,'sub'=&gt; &#91;'ps5'=&gt;10]];\n$yf = array_flip($y);\nprint_r($yf);\n\/\/ &#91;2] =&gt; phone\n\/\/ &#91;5] =&gt; headset\n\/\/ &#91;1] =&gt; hdd\n\/\/ &#91;3] =&gt; game\n\/\/ &#91;6] =&gt; box<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_SUM<\/strong> &#8211; sumariza ou contabiliza os elementos valores de um array desde que os valores possam ser convertidos para n\u00famero. Repare que no exemplo o produto box que cont\u00e9m o valor 6txt ser\u00e1 convertido para o n\u00famero 6, pois este \u00e9 o comportamento de convers\u00e3o padr\u00e3o esperado do PHP. Qualquer elemento que n\u00e3o possua um valor num\u00e9rico, como subarray, objeto, ou texto, n\u00e3o ser\u00e1 contabilizado. O retorno \u00e9 um escalar com o total da somat\u00f3ria dos elementos num\u00e9ricos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'phone'=&gt;'two','ssd'=&gt;5,'headset'=&gt;5,'mobile'=&gt;1,'game'=&gt;3,'hdd'=&gt;1,'box'=&gt;'6txt','sub'=&gt; &#91;'ps5'=&gt;10]];\necho 'total: ' . array_sum($y);\n\/\/ total: 21<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_FILTER<\/strong> &#8211; O famigerado array_filter \u00e9 um dos seus maiores aliados. O simples fato de parsear um array com array_filter j\u00e1 elimina todos os elementos com valor null, sem necessidade de nenhuma fun\u00e7\u00e3o callback. Combinado com  uma fun\u00e7\u00e3o callback ent\u00e3o o poder de sanitiza\u00e7\u00e3o \u00e9 exponencial. Mas lembre-se, array_filter n\u00e3o \u00e9 multilevel e n\u00e3o serve para sanitiza\u00e7\u00e3o em profundidade.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;'phone'=&gt;'two','ssd'=&gt;null,'headset'=&gt;'','mobile'=&gt;1,'game'=&gt;3,'hdd'=&gt;null,'box'=&gt;6,'sub'=&gt; &#91;'ps5'=&gt;10, 'ps3'=&gt;null]];\n$yt = array_filter($y);\nprint_r($yt);\n\/\/ &#91;phone] =&gt; two\n\/\/ &#91;mobile] =&gt; 1\n\/\/ &#91;game] =&gt; 3\n\/\/ &#91;box] =&gt; 6\n\/\/ &#91;sub] =&gt; Array\n\/\/ (\n\/\/   &#91;ps5] =&gt; 10\n\/\/   &#91;ps3] =&gt;\n\/\/ )\n\n$ytc = array_filter(\n  $y,\n  function($value) {\n    return !empty($value);\n  });\nprint_r($ytc);\n\/\/ &#91;phone] =&gt; two\n\/\/ &#91;mobile] =&gt; 1\n\/\/ &#91;game] =&gt; 3\n\/\/ &#91;box] =&gt; 6\n\/\/ &#91;sub] =&gt; Array\n\/\/ (\n\/\/   &#91;ps5] =&gt; 10\n\/\/   &#91;ps3] =&gt;\n\/\/ )<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_REVERSE<\/strong> &#8211; e sempre teremos o simples reverse para inverter a ordem de um array. Quando voc\u00ea precisa transformar uma pilha LIFO and uma fila FIFO uma ordena\u00e7\u00e3o por sort n\u00e3o \u00e9 seja desejada, ent\u00e3o simplesmente aplica-se a invers\u00e3o da ordem do array com o array_reverse.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = (&#91;'fruit'=&gt;'lemon',3=&gt;'bread','salad'=&gt;'lettuce',0=&gt;'rice','protein'=&gt;'eggs',1=&gt;'beans','carbohydrate'=&gt;'pasta']);\n$yr = array_reverse($y);\nprint_r($yr);\n\/\/ &#91;carbohydrate] =&gt; pasta\n\/\/ &#91;0] =&gt; beans\n\/\/ &#91;protein] =&gt; eggs\n\/\/ &#91;1] =&gt; rice\n\/\/ &#91;salad] =&gt; lettuce\n\/\/ &#91;2] =&gt; bread\n\/\/ &#91;fruit] =&gt; lemon<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_COLUMN<\/strong> &#8211; esta fun\u00e7\u00e3o \u00e9 muito \u00fatil para manipular dados no formato tipo tabela composto por linhas e colunas. Assim, um array simples n\u00e3o vai funcionar com array_column por que ele precisa receber um array de arrays e \u00e9 o segundo n\u00edvel que deve conter os arrays associativos composto pelas colunas de cada linha. At\u00e9 mesmo objetos s\u00e3o suportados pelo array_column.<\/p>\n\n\n\n<p>Os \u00edndices do primeiro n\u00edvel s\u00e3o irrelevantes para o processo, podem ser num\u00e9ricos sequenciais ou associativos, eles ser\u00e3o desprezados de qualquer forma. <\/p>\n\n\n\n<p>Al\u00e9m de buscar os valores da coluna desejada, o terceiro par\u00e2metro ainda indica o nome de uma poss\u00edvel coluna na mesma linha cujo valor possa servir de \u00edndice para chavear o valor retornado. No mundo real uma chave \u00fanica como ID seria o indicado. Lembrando que a coluna desejada n\u00e3o precisa existir em todas as linhas de qualquer linear, as linhas que n\u00e3o possu\u00edrem esta coluna ser\u00e3o desprezadas durante o processamento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y = &#91;\n&#91;'id'=>'0000','first'=>'Jonh','last'=>'Doe','email'=>'jonh.doe@email'],\n&#91;'id'=>1000,'first'=>'Mary','last'=>'Loe','email'=>'mary.loe@email'],\n&#91;'id'=>2000,'first'=>'Marilyn','last'=>'Moe','email'=>'marilyn.moe@email'],\n'one' => &#91;'id'=>1,'first'=>'Jonh','last'=>'Doe','eeeemail'=>'jonh.doe@email'],\n'two' => &#91;'id'=>2,'first'=>'Mary','last'=>'Loe','email'=>'mary.loe@email'],\n'three' => &#91;'id'=>3,'first'=>'Marilyn','last'=>'Moe','email'=>'marilyn.moe@email'],];\n$yc = array_column($y,'email','id');\nprint_r($yc);\n\/\/ &#91;0000] => jonh.doe@email\n\/\/ &#91;1000] => mary.loe@email\n\/\/ &#91;2000] => marilyn.moe@email\n\/\/ &#91;2] => mary.loe@email\n\/\/ &#91;3] => marilyn.moe@email<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_MERGE<\/strong> &#8211; O array_merge \u00e9 bastante controverso e as vezes n\u00e3o produz o resultado que voc\u00ea est\u00e1 querendo, mas ele funciona conforme foi projetado e as regras s\u00e3o bem claras.<\/p>\n\n\n\n<p>O array_merge usa um array como base e um outro array adicional para ser mergido no array base. Caso um \u00edndice associativo no array adicional exista no array base o valor do array adicional ser\u00e1 sobrescrito no array base. Caso o \u00edndice associativo no array adicional n\u00e3o exista no array base ele ser\u00e1 adicionado no array base. Todos os \u00edndices num\u00e9ricos no array adicional ser\u00e3o adicionados no array base com resequenciamento autom\u00e1tico, ou seja, n\u00e3o importa se o \u00edndice num\u00e9rico exista ou n\u00e3o no array base, ele ser\u00e1 inserido independentemente de qualquer condi\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ybase = &#91;'fruit'=&gt;'apple','drink'=&gt;'water','snack'=&gt;'chips',0=&gt;'juice',1=&gt;'banana'];\n$yadd = &#91;'fruit'=&gt;'naranja','drink'=&gt;'leche',0=&gt;'manzana',1=&gt;'pera'];\n$yg = array_merge($ybase, $yadd);\nprint_r($yg);\n\/\/ &#91;fruit] =&gt; naranja\n\/\/ &#91;drink] =&gt; leche\n\/\/ &#91;snack] =&gt; chips\n\/\/ &#91;0] =&gt; juice\n\/\/ &#91;1] =&gt; banana\n\/\/ &#91;2] =&gt; manzana\n\/\/ &#91;3] =&gt; pera<\/code><\/pre>\n\n\n\n<p><strong>ARRAY MERGE + SUGAR SYNTAX<\/strong> &#8211;  Uma outra forma de voc\u00ea fazer um merge de arrays \u00e9 utilizando o operador plus (+). S\u00f3 que o comportamento desta sintaxe \u00e9 um pouco diferente da fun\u00e7\u00e3o array_merge.<\/p>\n\n\n\n<p>Considere o array base e o array adicional, com a sugar syntax os \u00edndices do array adicional que n\u00e3o existirem no array base ser\u00e3o adicionados no array base, e ponto final. Assim se o objetivo \u00e9 simplesmente adicionar elementos omissos no array base a sugar syntax prov\u00ea um resultado melhor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ybase = &#91;'fruit'=&gt;'apple','drink'=&gt;'water','snack'=&gt;'chips',0=&gt;'juice',1=&gt;'banana'];\n$yadd = &#91;'fruit'=&gt;'naranja','drink'=&gt;'leche',0=&gt;'manzana',1=&gt;'pera',3=&gt;'frambuesa'];\n$ysg = $ybase + $yadd;\nprint_r($ysg);\n\/\/ &#91;fruit] =&gt; apple\n\/\/ &#91;drink] =&gt; water\n\/\/ &#91;snack] =&gt; chips\n\/\/ &#91;0] =&gt; juice\n\/\/ &#91;1] =&gt; banana\n\/\/ &#91;3] =&gt; raspberry<\/code><\/pre>\n\n\n\n<p><strong>ARRAY_REPLACE<\/strong> &#8211; Ao inv\u00e9s de array_merge ou merge sugar syntax considere utilizar array_replace para fazer o merge de arrays. Acontece que o array_replace no final das contas produz o resultado mais esperado na maioria das situa\u00e7\u00f5es.<\/p>\n\n\n\n<p>O array_replace faz o match entre array base e array adicional para qualquer tipo de \u00edndice, associativo e num\u00e9rico. Os \u00edndices que fazem match ser\u00e3o sobrescritos na array base e os \u00edndices omissos ser\u00e3o adicionados no array base.<\/p>\n\n\n\n<p>Simples, pr\u00e1tico e objetivo!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ybase = &#91;'fruit'=&gt;'apple','drink'=&gt;'water','snack'=&gt;'chips',0=&gt;'juice',1=&gt;'banana'];\n$yadd = &#91;'fruit'=&gt;'naranja','drink'=&gt;'leche',0=&gt;'manzana',1=&gt;'pera',3=&gt;'frambuesa'];\n$yr = array_replace($ybase, $yadd);\nprint_r($yr);\n\/\/ &#91;fruit] =&gt; naranja\n\/\/ &#91;drink] =&gt; leche\n\/\/ &#91;snack] =&gt; chips\n\/\/ &#91;0] =&gt; manzana\n\/\/ &#91;1] =&gt; pera\n\/\/ &#91;3] =&gt; frambuesa<\/code><\/pre>\n\n\n\n<p> Resumindo, as fun\u00e7\u00f5es array prontas funcionam como uma caixa de ferramentas, se voc\u00ea n\u00e3o sabe como aplic\u00e1-las corretamente acabar\u00e1 usando somente o martelo e a talhadeira! Ou em \u00faltimo caso, s\u00f3 a <strong>MARRETA<\/strong> mesmo&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1 algum tempo eu estava num desafio de codifica\u00e7\u00e3o na Plataforma Hacker Rank e apareceu uma quest\u00e3o que usava muitos recursos de ARRAY&#8230; pensei comigo, t\u00e1 no papo! S\u00f3 que n\u00e3o&#8230; Meu principal erro n\u00e3o foi subestimar o problema, mas sim subestimar a memoriza\u00e7\u00e3o das fun\u00e7\u00f5es array e o porqu\u00ea delas existirem. Como de costume, [&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,98,85,94,97,100,99,92,101,103,93,102,96,107,105,109,108,106,104],"class_list":["post-203","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-array","tag-array_count_values","tag-array_filter","tag-array_flip","tag-array_keys","tag-array_pop","tag-array_push","tag-array_reverse","tag-array_shift","tag-array_slice","tag-array_sum","tag-array_unshift","tag-array_values","tag-arsort","tag-asort","tag-krsort","tag-ksort","tag-rsort","tag-sort"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/203","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=203"}],"version-history":[{"count":21,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/203\/revisions"}],"predecessor-version":[{"id":228,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/203\/revisions\/228"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=203"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=203"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}