{"id":280,"date":"2021-07-04T20:45:54","date_gmt":"2021-07-04T20:45:54","guid":{"rendered":"http:\/\/jplatz.com.br\/syntax\/?p=280"},"modified":"2021-07-04T20:45:56","modified_gmt":"2021-07-04T20:45:56","slug":"php-array-usando-reset-para-extrair-a-primeira-linha-de-um-array","status":"publish","type":"post","link":"https:\/\/jplatz.com.br\/syntax\/2021\/07\/04\/php-array-usando-reset-para-extrair-a-primeira-linha-de-um-array\/","title":{"rendered":"PHP Array Usando RESET para Extrair a Primeira Linha de um Array"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>$y&#91;0] = &#91; 'col1' => 'A', 'col2' => 'B', 'col3' => 'C' ];\n$y&#91;1] = &#91; 'col1' => 'value1', 'col2' => 'value2', 'col3' => 'value3' ];\n$y&#91;2] = &#91; 'col1' => 'value4', 'col2' => 'value5', 'col3' => 'value6' ];\n$y&#91;3] = &#91; 'col1' => 'value7', 'col2' => 'value8', 'col3' => 'value9' ];\n\n$header = reset($y);\nvar_dump($header);\n\n\/\/ array(3) { \n\/\/   &#91;\"col1\"] => string(1) \"A\"\n\/\/   &#91;\"col2\"] => string(1) \"B\"\n\/\/   &#91;\"col3\"] => string(1) \"C\"\n\/\/ }<\/code><\/pre>\n\n\n\n<p>Pode parecer uma tarefa super simples pegar o primeiro elemento de um array, e realmente \u00e9!!! Desde a semana passada o <strong>reset<\/strong>() \u00e9 o meu jeito preferido de fazer isso.<\/p>\n\n\n\n<p>Recentemente quando estive implementando a importa\u00e7\u00e3o de um arquivo tipo planilha de dados naturalmente tive a necessidade de processar a primeira linha a qual continha o HEADER dos dados. Ent\u00e3o me deparei com um c\u00f3digo existente que me pareceu muito estranho a princ\u00edpio, d\u00e1 uma olhada nisso&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$mapped_headers = $this->map_headers(<strong>reset<\/strong>($spreadsheet_rows));<\/code><\/pre>\n\n\n\n<p>Para quem \u00e9 familiar a este tipo de processamento sabe que estamos falando de um array bidimensional no melhor estilo linhas x colunas. O que eu n\u00e3o entendi foi aquele <strong>reset<\/strong>() ali na invoca\u00e7\u00e3o do map_headers&#8230; que janho!!!<\/p>\n\n\n\n<p>Como de praxe fui debugar e entender como a combina\u00e7\u00e3o funcionava&#8230; Para o meu espanto, somente agora eu entendi que o comando reset, al\u00e9m de resetar o ponteiro interno do array, retorna tamb\u00e9m o primeiro elemento do array.<\/p>\n\n\n\n<p>Isto \u00e9 fant\u00e1stico!!! Eu sempre me perguntei por que o PHP n\u00e3o tinha um comando <strong>first<\/strong>() para pegar o primeiro elemento de um array j\u00e1 que temos o comando <strong>current<\/strong>() e o comando <strong>end<\/strong>(). <\/p>\n\n\n\n<p>Uma alternativa ao <strong>reset<\/strong>() seria inverter a array e usar o comando <strong>end<\/strong>(), mas acho que n\u00e3o tem necessidade de complicar o c\u00f3digo com essa miscel\u00e2nea pra atingir o mesmo resultado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$r = array_reverse($y);\n$header = end($r);\nvar_dump($header); \n\n\/\/ array(3) { \n\/\/   &#91;\"col1\"] => string(1) \"A\"\n\/\/   &#91;\"col2\"] => string(1) \"B\"\n\/\/   &#91;\"col3\"] => string(1) \"C\"\n\/\/ }<\/code><\/pre>\n\n\n\n<p>Outra combina\u00e7\u00e3o poss\u00edvel seria combinar <strong>current<\/strong>() com <strong>reset<\/strong>(), mas tamb\u00e9m seria um desperd\u00edcio j\u00e1 que o reset j\u00e1 faz o trabalho esperado.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>reset($y);\n$header = current($y);\nvar_dump($header); \n\n\/\/ array(3) { \n\/\/   &#91;\"col1\"] => string(1) \"A\"\n\/\/   &#91;\"col2\"] => string(1) \"B\"\n\/\/   &#91;\"col3\"] => string(1) \"C\"\n\/\/ }<\/code><\/pre>\n\n\n\n<p>Outra alternativa segura de pegarmos o primeiro elemento da array seria fatiar o array com <strong>array_slice<\/strong>(), lembrando que este comando extrai o elemento como bidimensional preservando o \u00edndice da linha. Ainda assim teria que combinar com <strong>array_shift<\/strong>() ou <strong>array_pop<\/strong>() para pegar o primeiro elemento como array simples.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$first_row = array_slice($y, 0, 1);\nvar_dump($first_row); \n\n\/\/ array(1) {\n\/\/   &#91;0]=>\n\/\/   array(3) {\n\/\/     &#91;\"col1\"]=> string(1) \"A\"\n\/\/     &#91;\"col2\"]=> string(1) \"B\"\n\/\/     &#91;\"col3\"]=> string(1) \"C\"\n\/\/   }\n\/\/ }\n\n$header = array_shift($first_row);\nvar_dump($header); \n\n\/\/ array(3) { \n\/\/   &#91;\"col1\"] => string(1) \"A\"\n\/\/   &#91;\"col2\"] => string(1) \"B\"\n\/\/   &#91;\"col3\"] => string(1) \"C\"\n\/\/ }<\/code><\/pre>\n\n\n\n<p>Pra finalizar uma \u00faltima alternativa segura que podemos considerar seria utilizar <strong>array_values<\/strong>(). Sabemos que a primeira linha do array representam os headers n\u00e3o importa qual \u00e9 a chave utilizada na indexa\u00e7\u00e3o destas linhas. Ent\u00e3o <strong>array_values<\/strong>() garante que o \u00edndice da primeira linha seja ZERO atrav\u00e9s do re-sequenciamento do array sem alterar a ordem de seus elementos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$y&#91;'Z'] = &#91; 'col1' => 'A', 'col2' => 'B', 'col3' => 'C' ];\n$y&#91;'X'] = &#91; 'col1' => 'value1', 'col2' => 'value2', 'col3' => 'value3' ];\n$y&#91;'S'] = &#91; 'col1' => 'value4', 'col2' => 'value5', 'col3' => 'value6' ];\n$y&#91;'J'] = &#91; 'col1' => 'value7', 'col2' => 'value8', 'col3' => 'value9' ];\n\n$header = array_values($y)&#91;0];\nvar_dump($header); \n\n\/\/ array(3) { \n\/\/   &#91;\"col1\"] => string(1) \"A\"\n\/\/   &#91;\"col2\"] => string(1) \"B\"\n\/\/   &#91;\"col3\"] => string(1) \"C\"\n\/\/ }<\/code><\/pre>\n\n\n\n<p>N\u00e3o exploramos outras alternativas como loop <strong>foreach<\/strong>() e <strong>for<\/strong>() mas nem precisa, com o PHP certamente encontraremos pelo menos mais meia d\u00fazia de outras formas para atingir o mesmo resultado.<\/p>\n\n\n\n<p>Agora convenhamos, o <strong>reset<\/strong>() arrasou!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pode parecer uma tarefa super simples pegar o primeiro elemento de um array, e realmente \u00e9!!! Desde a semana passada o reset() \u00e9 o meu jeito preferido de fazer isso. Recentemente quando estive implementando a importa\u00e7\u00e3o de um arquivo tipo planilha de dados naturalmente tive a necessidade de processar a primeira linha a qual continha [&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,101,103,96,142,141,140],"class_list":["post-280","post","type-post","status-publish","format-standard","hentry","category-backend","category-coding","category-php","tag-array","tag-array_shift","tag-array_slice","tag-array_values","tag-current","tag-end","tag-reset"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/280","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=280"}],"version-history":[{"count":1,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/280\/revisions"}],"predecessor-version":[{"id":281,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/posts\/280\/revisions\/281"}],"wp:attachment":[{"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/media?parent=280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/categories?post=280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jplatz.com.br\/syntax\/wp-json\/wp\/v2\/tags?post=280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}