如何在 PHP 中重新索引一个数组,但索引从1开始?

我有以下数组,我想重新索引,以便键反转(理想情况下从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] =>
)


)
244725 次浏览

为什么要重新建立索引呢? 只要在索引中加1:

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

编辑 在问题被澄清之后: 您可以使用 array_values将索引从0开始重置。然后,如果希望打印的元素从1开始,那么可以使用上面的算法。

这个可以满足你的要求:

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


?>

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

然而 ,为了回答你的问题,这个函数应该将任何数组转换成基于1的版本

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

剪辑

如果您需要的话,这里有一个更加可重用/灵活的函数

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

如果你想从零开始重新索引,只需要执行以下操作:

$iZero = array_values($arr);

如果你需要从一开始,那么使用以下方法:

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

以下是所使用功能的手册页:

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

您可能需要考虑为什么要使用基于1的数组。从零开始的数组(在使用非关联数组时)是相当标准的,如果您想要输出到 UI,大多数将通过在输出到 UI 时增加整数来处理解决方案。

当考虑数组的基于1的索引器时,要考虑应用程序和代码中的一致性。

一个更优雅的解决方案是:

$list = array _ merge (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
)

如果你没有尝试重新排序数组,你可以这样做:

$array = array_reverse( $array );

然后再次调用它,让它回到同样的顺序:

$array = array_reverse( $array );

array_reverse()在反转时重新索引。很久以前有人给我看过这个。所以不能归功于我。但它非常简单快捷。

结果是一个带有从0.https://3v4l.org/iQgVh开始的索引键的数组

array (
0 =>
(object) array(
'title' => 'Section',
'linked' => 1,
),
1 =>
(object) array(
'title' => 'Sub-Section',
'linked' => 1,
),
2 =>
(object) array(
'title' => 'Sub-Sub-Section',
'linked' => NULL,
),
)

下面是我自己的实现。输入数组中的键将用从 $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);
}

感觉好像所有的 array_combine()答案都在复制同一个“错误”(不必要的 array_values()调用)。

array_combine()忽略它接收到的两个参数的键。

密码: (演示)

$array = [
2 => (object)['title' => 'Section', 'linked' => 1],
1 => (object)['title' => 'Sub-Section', 'linked' => 1],
0 => (object)['title' => 'Sub-Sub-Section', 'linked' => null]
];


var_export(array_combine(range(1, count($array)), $array));

产出:

array (
1 =>
(object) array(
'title' => 'Section',
'linked' => 1,
),
2 =>
(object) array(
'title' => 'Sub-Section',
'linked' => 1,
),
3 =>
(object) array(
'title' => 'Sub-Sub-Section',
'linked' => NULL,
),
)

我能想到的最快的方法

array_unshift($arr, null);
unset($arr[0]);
print_r($arr);

如果你只是想重新索引数组(从零开始) ,并且你有 PHP + 7.3,你可以这样做

array_unshift($arr);

我认为 array_unshiftarray_values好,因为前者不创建数组的副本。

更衣室

版本 描述
7.3.0 现在只能用一个参数调用这个函数。以前,至少需要两个参数。

—— https://www.php.net/manual/en/function.array-unshift.php#refsect1-function.array-unshift-changelog