English 中文(简体)
你如何在 PHP 中重新索引一个数组,但是索引从1开始?
原标题:
  • 时间:2009-02-26 15:46:37
  •  标签:

我有以下数组,我希望重新索引以使键被颠倒(最好从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);

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

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

这里是所用函数的手册页面:

问题回答

为什么要重新编制索引?只需将索引加1即可:

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

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

你可以重建一个数组,使其从索引1开始,方法如下:

$arr = array(
   2  =>  red ,
   1  =>  green ,
   0  =>  blue ,
);

$arr1 = array_values($arr);   // Reindex the array starting from zero*.
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_values()命令。自PHP 4.3以来,array_unshift()重新索引传入数组的数字键。

这将实现您想要的。

<?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的数组(在使用非关联数组时)是非常标准的,如果你想要输出到界面,大多数情况下只需要在输出到界面时增加整数即可解决。

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

嗯,我认为无论您的最终目标是什么,您实际上都不需要修改数组以使其基于1而不是基于0,而可以像Gumbo发布的那样在迭代时间处理它。

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

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

EDIT

如果你需要的话,这是一个更可重用/灵活的函数。

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

A more elegant solution:

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

我能想到的最快的方法

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

如果您只想重新索引数组(从零开始),且您使用的是PHP +7.3,可以按以下方式执行。

array_unshift($arr);

我相信array_unshiftarray_values更好,因为前者不会创建数组的副本。

Changelog

Version Description
7.3.0 This function can now be called with only one parameter. Formerly, at least two parameters have been required.

将此翻译为中文:--https://www.php.net/manual/en/function.array-unshift.php#refsect1-function.array-unshift-changelog。 https://www.php.net/manual/en/function.array-unshift.php#refsect1-function.array-unshift-changelog

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

感觉所有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 = 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);
}




相关问题
热门标签