как вы переиндексировать массив в php?

<p>у меня есть следующий массив, который я хотел бы переиндексировать, чтобы ключи поменялись местами (в идеале, начиная с 1):</p><p>текущий массив (<strong> edit: </strong>массив на самом деле выглядит так):</p><pre><code>array ( [2] => object ( [title] => section [linked] => 1 ) [1] => object ( [title] => sub-section [linked] => 1 ) [0] => object ( [title] => sub-sub-section [linked] => ) ) </code></pre><p>как это должно быть:</p><pre><code>array ( [1] => object ( [title] => section [linked] => 1 ) [2] => object ( [title] => sub-section [linked] => 1 ) [3] => object ( [title] => sub-sub-section [linked] => ) ) </code></pre>

<p>если вы хотите переиндексировать, начиная с нуля, просто сделайте следующее:</p><pre><code>$izero = array_values($arr); </code></pre><p>если вам нужно, чтобы начать с одного, то используйте следующее:</p><pre><code>$ione = array_combine(range(1, count($arr)), array\_values($arr)); вот справочные страницы для используемых функций:  <a href="http://ca3.php.net/manual/en/function.array-values.php">array_values()   <a href="http://ca3.php.net/manual/en/function.array-combine.php">array_combine()   <a href="http://ca3.php.net/manual/en/function.range.php">range()  

<strong> вот лучший способ </strong>:# array $array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana'); </code></pre><p>это возвращает</p><pre><code>array ( [0] => tomato [1] => [2] => apple [3] => melon [4] => cherry [5] => [6] => [7] => banana ) </code></pre><p>делая это</p><pre><code>$array = array_values(array_filter($array)); </code></pre><p>вы получаете это</p><pre><code>array ( [0] => tomato [1] => apple [2] => melon [3] => cherry [4] => banana ) </code></pre><p><strong> объяснение </strong></p><p><code>array\_values()</code>: возвращает значения входного массива и численно индексирует.</p><p><code>array\_filter()</code>: фильтрует элементы массива с помощью пользовательской функции (udf<strong> если ничего не указано </strong>,<strong> все записи во входной таблице со значением false будут удалены </strong>.)</p>

<p>я только что узнал, что вы также можете сделать</p><pre><code>array\_splice($ar, 0, 0); это делает переиндексацию на месте, поэтому вы не получите копию исходного массива.

почему переиндексация? просто добавьте 1 к индексу:foreach ($array as $key => $val) { echo $key + 1, ''; } <strong> редактировать </strong>после того, как вопрос прояснился: вы можете использовать array_values для сброса индекса, начиная с 0. затем вы можете использовать алгоритм, приведенный выше, если вы просто хотите, чтобы напечатанные элементы начинались с 1.

что ж, я хотел бы думать, что для любой вашей конечной цели вам на самом деле не нужно изменять массив, чтобы он был основан на 1, а не на 0, но вместо этого мог бы обрабатывать его во время итерации, как написал гамбо. однако , чтобы ответить на ваш вопрос, эта функция должна конвертировать любой массив в версию на основе 1function converttoonebased( $arr ) { return array\_combine( range( 1, count( $arr ) ), array_values( $arr ) ); } </code></pre><h2>правка</h2><p>вот более многоразовая/гибкая функция, если хотите</p><pre><code>$arr = array( 'a', 'b', 'c' ); echo ''; print_r( reindexarray( $arr ) ); print\_r( reindexarray( $arr, 1 ) ); print_r( reindexarray( $arr, 2 ) ); print\_r( reindexarray( $arr, 10 ) ); print_r( reindexarray( $arr, -10 ) ); echo '</pre>'; function reindexarray( $arr, $startat=0 ) { return ( 0 == $startat ) ? array_values( $arr ) : array\_combine( range( $startat, count( $arr ) + ( $startat - 1 ) ), array_values( $arr ) ); } </code></pre>

<p>вы можете переиндексировать массив, чтобы новый массив начинался с индекса 1 следующим образом;</p><pre><code>$arr = array( '2' => 'red', '1' => 'green', '0' => 'blue', ); $arr1 = array\_values($arr); // reindex the array starting from 0. array_unshift($arr1, ''); // prepend a dummy element to the start of the array. unset($arr1[0]); // kill the dummy element. print_r($arr); print\_r($arr1); выход из вышесказанного есть;array ( [2] => red [1] => green [0] => blue ) array ( [1] => red [2] => green [3] => blue ) 

это будет делать то, что вы хотите:<?php $array = array(2 => 'a', 1 => 'b', 0 => 'c'); array\_unshift($array, false); // add to the start of the array $array = array\_values($array); // re-number // remove the first index so we start at 1 $array = array\_slice($array, 1, count($array), true); print\_r($array); // array ( [1] => a [2] => b [3] => c ) ?> 

более элегантное решение:  $list = array\_combine(range(1, count($list)), array_values($list)); </pre></code></p>

<p>как и @monowerker, мне нужно было переиндексировать массив, используя ключ объекта ...</p><pre><code>$new = array(); $old = array( (object)array('id' => 123), (object)array('id' => 456), (object)array('id' => 789), ); print\_r($old); array_walk($old, function($item, $key, &$reindexed_array) { $reindexed\_array[$item->id] = $item; }, &$new); print_r($new); </code></pre><p>это привело к:</p><pre><code>array ( [0] => stdclass object ( [id] => 123 ) [1] => stdclass object ( [id] => 456 ) [2] => stdclass object ( [id] => 789 ) ) array ( [123] => stdclass object ( [id] => 123 ) [456] => stdclass object ( [id] => 456 ) [789] => stdclass object ( [id] => 789 ) ) </code></pre>

<p>вы можете подумать, почему вы вообще хотите использовать массив на основе 1. массивы на основе нуля (при использовании неассоциативных массивов) довольно стандартны, и если вы хотите выводить данные в пользовательский интерфейс, большинство из них справится с решением, просто увеличив целое число при выводе в пользовательский интерфейс.</p><p>подумайте о согласованности - как в вашем приложении, так и в коде, с которым вы работаете, - когда будете думать об индексаторах на основе 1 для массивов.</p>

<p>если вы не пытаетесь переупорядочить массив, вы можете просто сделать:</p><p>$ array = array_reverse ($ array);<br> $ array = array_reverse ($ array);</p><p>массив array\_reverse очень быстрый и меняет порядок при обратном. кто-то еще показал мне это давным-давно. так что я не могу взять кредит за то, что придумал это. но это очень просто и быстро.</p>

<pre><code>$tmp = array(); foreach (array_values($array) as $key => $value) { $tmp[$key+1] = $value; } $array = $tmp; 

удаление дубликатов и переиндексация массива:<?php $oldarray = array('0'=>'php','1'=>'java','2'=>'','3'=>'asp','4'=>'','5'=>'mysql'); //duplicate removal $fillteredarray = array_filter($oldarray); //reindexing actually happens here $newarray = array_merge($filteredarray); print\_r($newarray); ?> 

вот моя собственная реализация. ключи во входном массиве будут перенумерованы с приращением ключей, начиная с $ start\_index.</p><pre><code>function array\_reindex($array, $start\_index) { $array = array_values($array); $zeros_array = array_fill(0, $start\_index, null); return array\_slice(array\_merge($zeros_array, $array), $start_index, null, true); } 

сортировка - это просто <a href="http://php.net/sort">sort () , переиндексация кажется немного глупой, но если это необходимо, она сделает это. хотя не на месте. используйте <a href="http://php.net/manual/en/function.array-walk.php">array_walk () , если вы будете делать это в нескольких местах, просто используйте цикл for-key-value, если это одноразовая операция.<?php function reindex(&$item, $key, &$reindexedarr) { $reindexedarr[$key+1] = $item; } $arr = array (2 => 'c', 1 => 'b', 0 => 'a'); sort($arr); $newarr = array(); array\_walk($arr, reindex, &$newarr); $arr = $newarr; print\_r($arr); // array ( [1] => a [2] => b [3] => c ) ?> 

подобно вкладу ника, я пришел к тому же решению для переиндексации массива, но немного улучшил функцию, поскольку с php версии 5.4 она не работает из-за передачи переменных по ссылке. пример функции переиндексации в таком случае выглядит следующим образом: закрытие ключевого слова use:function indexarraybyelement($array, $element) { $arrayreindexed = []; array\_walk( $array, function ($item, $key) use (&$arrayreindexed, $element) { $arrayreindexed[$item[$element]] = $item; } ); return $arrayreindexed; } </code></pre>

<p>просто сделайте это:</p><pre><code><?php array\_push($array, ''); $array = array\_reverse($array); array_shift($array); </code></pre>