你如何重新索引一个数组在PHP中?

我有下面的数组,我想重新索引,所以键被颠倒(理想情况下从1开始):

当前数组( 编辑:数组实际看起来像这样):

Array ( [2] => Object ( [title] => Section [linked] => 1 ) [1] => Object ( [title] => Sub-Section [linked] => 1 ) [0] => Object ( [title] => Sub-Sub-Section [linked] => ) ) 

它应该如何:

 Array ( [1] => Object ( [title] => Section [linked] => 1 ) [2] => Object ( [title] => Sub-Section [linked] => 1 ) [3] => Object ( [title] => Sub-Sub-Section [linked] => ) ) 

如果您想重新索引为零,只需执行以下操作:

 $iZero = array_values($arr); 

如果您需要从一开始,请使用以下内容:

 $iOne = array_combine(range(1, count($arr)), array_values($arr)); 

以下是所使用function的手册页面:

  • array_values()
  • array_combine()
  • range()

这是最好的方法

 # Array $array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana'); 

返回

 Array ( [0] => tomato [1] => [2] => apple [3] => melon [4] => cherry [5] => [6] => [7] => banana ) 

通过做这个

 $array = array_values(array_filter($array)); 

你得到这个

 Array ( [0] => tomato [1] => apple [2] => melon [3] => cherry [4] => banana ) 

说明

array_values() :以数字方式返回input数组和索引的值。

array_filter() :用一个用户定义的函数(UDF array_filter()过滤数组的元素。 如果没有提供则input表中所有值为FALSE的项都将被删除

为什么要重新索引? 只需在索引中加1:

 foreach ($array as $key => $val) { echo $key + 1, '<br>'; } 

编辑问题已经澄清之后:您可以使用array_values重置从0开始的索引。然后,如果您只想打印的元素从1开始,则可以使用上面的algorithm。

我刚刚发现你也可以做一个

 array_splice($ar, 0, 0); 

这就是重新索引就绪,所以你最终不会得到原始数组的副本。

那么,我想,无论你的最终目标是什么,你实际上不需要修改数组是基于1的,而是基于0的,但是可以在Gumbo发布的迭代时间处理它。

但是 ,要回答你的问题,这个函数应该将任何数组转换为基于1的版本

 function convertToOneBased( $arr ) { return array_combine( range( 1, count( $arr ) ), array_values( $arr ) ); } 

编辑

这是一个更可重用/灵活的function,如果你想要的话

 $arr = array( 'a', 'b', 'c' ); echo '<pre>'; 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 ) ); } 

这将做你想要的:

 <?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 ) ?> 

更优雅的解决scheme:

 $ list = array_combine(range(1,count($ list)),array_values($ list));

您可能要考虑为什么要使用基于1的arrays。 基于零的数组(当使用非关联数组的时候)是非常标准的,如果你想要输出到UI,大多数人会通过增加输出到UI的整数来处理解决scheme。

在考虑基于1的数组索引器时,考虑一致性 – 无论是在应用程序还是在您使用的代码中。

类似于@monowerker,我需要使用对象的键重新索引一个数组…

 $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); 

这导致:

 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 ) ) 

你可以重新索引一个数组,这样新的数组就像这样以索引1开始;

 $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 ) 
 $tmp = array(); foreach (array_values($array) as $key => $value) { $tmp[$key+1] = $value; } $array = $tmp; 

如果你不想重新排列数组,你可以这样做:

$ array = array_reverse($ array);
$ array = array_reverse($ array);

array_reverse速度非常快,并且在反转时重新sorting。 其他人很久以前就给我看了。 所以我不能赞扬它的提出。 但它非常简单和快速。

重复删除并重新索引一个数组:

 <?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); ?> 

sorting只是一种() ,reindexing似乎有点傻,但如果需要这将做到这一点。 虽然不是在地方。 使用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 ) ?> 

和Nick的贡献类似,我也是为了重组数据而使用相同的解决scheme,但是从PHP版本5.4开始,这个function稍微增强了一些,但是因为通过引用传递variables,所以不起作用。 例如reindexing函数就像这样use关键字closures:

 function indexArrayByElement($array, $element) { $arrayReindexed = []; array_walk( $array, function ($item, $key) use (&$arrayReindexed, $element) { $arrayReindexed[$item[$element]] = $item; } ); return $arrayReindexed; } 

这是我自己的实现。 input数组中的键将使用从$ start_index开始的递增键重新编号。

 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); } 

如果可以做一个新的数组是这样的:

 $result = array(); foreach ( $array as $key => $val ) $result[ $key+1 ] = $val; 

如果您需要就地撤销,则需要向后运行,以免踩到需要的索引:

 for ( $k = count($array) ; $k-- > 0 ; ) $result[ $k+1 ] = $result[ $k ]; unset( $array[0] ); // remove the "zero" element