我有以下数组,我想重新索引,所以键是相反的(理想情况下从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] => ) )
Andrew Moore.. 403
如果要将索引重新开始归零,只需执行以下操作:
$iZero = array_values($arr);
如果您需要从一开始,请使用以下内容:
$iOne = array_combine(range(1, count($arr)), array_values($arr));
以下是所用功能的手册页:
array_values()
array_combine()
range()
小智.. 54
这是最好的方法:
# 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()
:以数字方式返回输入数组和索引的值.
array_filter()
:使用用户定义的函数过滤数组的元素(UDF 如果未提供,则将删除输入表中值为FALSE的所有条目.)
如果要将索引重新开始归零,只需执行以下操作:
$iZero = array_values($arr);
如果您需要从一开始,请使用以下内容:
$iOne = array_combine(range(1, count($arr)), array_values($arr));
以下是所用功能的手册页:
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()
:以数字方式返回输入数组和索引的值.
array_filter()
:使用用户定义的函数过滤数组的元素(UDF 如果未提供,则将删除输入表中值为FALSE的所有条目.)
我刚刚发现你也可以做一个
array_splice($ar, 0, 0);
这会重新建立索引,因此您不会得到原始数组的副本.
为什么重新索引?只需在索引中添加1:
foreach ($array as $key => $val) { echo $key + 1, '
'; }
编辑 问题澄清之后:您可以使用array_values
从0开始重置索引.如果您只是希望打印元素从1开始,则可以使用上面的算法.
好吧,我想,无论你的最终目标是什么,你实际上都不需要将数组修改为基于1而不是基于0,但是可以像Gumbo发布的那样在迭代时间处理它.
但是,要回答您的问题,此函数应将任何数组转换为基于1的版本
function convertToOneBased( $arr ) { return array_combine( range( 1, count( $arr ) ), array_values( $arr ) ); }
如果您需要,这是一个更可重用/灵活的功能
$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 ''; function reIndexArray( $arr, $startAt=0 ) { return ( 0 == $startAt ) ? array_values( $arr ) : array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) ); }
这将做你想要的:
'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 ) ?>
您可能要考虑为什么完全要使用基于1的数组。从零开始的数组(使用非关联数组时)是非常标准的,如果要输出到UI,大多数将通过在输出到UI时增加整数来处理该解决方案。
在考虑基于1的数组索引器时,请考虑应用程序和使用的代码中的一致性。
更优雅的解决方案:
$list = array_combine(range(1, count($list)), array_values($list));
您可以重新索引数组,以便新数组以索引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 )