Php 如何将数组键更改为从1开始而不是从0开始

Php 如何将数组键更改为从1开始而不是从0开始,php,arrays,Php,Arrays,我有一些数组中的值,我想重新索引整个数组,这样第一个值键应该是1而不是0,即 在PHP中,默认情况下,数组键从0开始。i、 e.0=>a,1=>b,我想重新索引整个数组,从key=1开始,即1=>a,2=>b,…。 $alphabet = array("a", "b", "c"); array_unshift($alphabet, "phoney"); unset($alphabet[0]); 编辑:我决定对本主题中提出的其他解决方案进行基准测试。下面是我使用的非常简单的代码: $start

我有一些数组中的值,我想重新索引整个数组,这样第一个值键应该是1而不是0,即

在PHP中,默认情况下,数组键从0开始。i、 e.
0=>a,1=>b
,我想重新索引整个数组,从key=1开始,即
1=>a,2=>b,…。

$alphabet = array("a", "b", "c");
array_unshift($alphabet, "phoney");
unset($alphabet[0]);
编辑:我决定对本主题中提出的其他解决方案进行基准测试。下面是我使用的非常简单的代码:

$start = microtime(1);
for ($a = 0; $a < 1000; ++$a) {
    $alphabet = array("a", "b", "c");
    array_unshift($alphabet, "phoney");
    unset($alphabet[0]);
}
echo (microtime(1) - $start) . "\n";


$start = microtime(1);
for ($a = 0; $a < 1000; ++$a) {
    $stack = array('a', 'b', 'c');
    $i= 1;
    $stack2 = array();
    foreach($stack as $value){
        $stack2[$i] = $value;
        $i++;
    }
    $stack = $stack2;
}
echo (microtime(1) - $start) . "\n";


$start = microtime(1);
for ($a = 0; $a < 1000; ++$a) {
    $array = array('a','b','c');

    $array = array_combine(
        array_map(function($a){
            return $a + 1;
        }, array_keys($array)),
        array_values($array)
    );
}
echo (microtime(1) - $start) . "\n";
试试这个

<?php
$stack = array('a', 'b', 'c', 'd');
$i= 1;
foreach($stack as $value){
    $stack2[$i] = $value;
    $i++;
}
$stack = stack2;
?>

试试这个

$array = array("a","b","c");
array_unshift($array,"");
unset($array[0]);
以下是我的建议:

<?php
$alphabet = array(1 => 'a', 'b', 'c', 'd');
echo '<pre>';
print_r($alphabet);
echo '</pre>';
?>

Ricardo Miguel的解决方案在定义数组并希望第一个键为1时效果最好。但是,如果您的数组已经定义或在其他地方组合在一起(不同的函数或循环),您可以这样修改它:

$data = array_slice(range(0,12), 1, null, true);

// Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 [11] => 11 [12] => 12 )

array\u merge
将一个包含1个空元素的数组和另一个数组放在一起,对其重新索引,
array\u filter
然后将删除空数组元素(
$array[0]
),使其从1开始。

如果使用范围,请尝试以下代码:

$array = array('a', 'b', 'c', 'd');
$array = array_combine(range(1, count($array)), array_values($array));
print_r($array);
结果是:

  foreach($items as $index => $item){
 echo $index+1 . $item
}

我知道这个答案非常古老,但我的解决方案是在索引中添加+1。我会这样做,因为我认为这是更快,更容易阅读。当你打印它时,它将从1开始,因为0+1=1,然后是2,以此类推

$x = array("a","b","c");
$y =array_combine(range(1, count($x)), $x);
print_r($y);

我认为这很简单:

 'Month'=>  [ 1  => "January","February","March","April","May","June","July","August","September","October","November","December"],
在php中使用

$data = ['a', 'b', 'c', 'd'];
$data = array_merge([''], $data);
unset($data[0]);
我发现,在PHP7.1+版本上,这将比公认的解决方案稍好一些

基准代码:

0.0011248588562012 
0.0017051696777344 

这些基准的差异会随着数组值数量的增加而增加。

有什么理由不能只使用基于零的数组吗?@Jacob,例如,一个for循环,它使用
%==0
来定义
标记。
$i[0]
使
跳闸。无论如何,这就是我在这个问题上的结局:)为什么在这个问题上有这么多赞成票?基于0的索引有什么问题?此解决方案比公认的解决方案更简单、更快。您的回答忽略了我们不能随意选择索引!否则,问题就不存在了!这个解决方案也忽略了,有时数组是动态生成并传递给变量的,因此我们不能在没有额外不必要的代码的情况下访问第一个键。我更喜欢我们的解决方案,因为ricardo的解决方案是针对arrayNo的静态定义的,这是一个错误的解决方案,
array\u filter
将删除所有空值,而不仅仅是合并的元素。例如,如果
$array=array('a','b',''),您将丢失应保留的第三个元素。@fishbounded它不是通用解决方案。仅供参考,在第二种方法中,
$i=1;foreach($stack1作为$value){$stack2[$i]=$value;$i++;}
将不会执行与
foreach($stack1作为$k=>$val){$stack2[$k+1]=$val;}
相同的操作。回答非常好!如果索引和值都匹配,并且从1开始,或者
array\u combine(范围(1,10),范围(1,10))
如果您只需要数字,那么这样做很好。我假设这个正确的工作答案只会被否决,因为它是一个纯代码的答案。
$x = array("a","b","c");
$y =array_combine(range(1, count($x)), $x);
print_r($y);
 'Month'=>  [ 1  => "January","February","March","April","May","June","July","August","September","October","November","December"],
$data = ['a', 'b', 'c', 'd'];
$data = array_merge([''], $data);
unset($data[0]);
$start = microtime(1);
for ($a = 0; $a < 10000; ++$a) {
    $data = ['a', 'b', 'c', 'd'];
    $data = array_merge([''], $data);
    unset($data[0]);
}
echo (microtime(1) - $start) . "\n";

$start = microtime(1);
for ($a = 0; $a < 10000; ++$a) {
    $data = ['a', 'b', 'c', 'd'];
    array_unshift($data, '');
    unset($data[0]);
}
echo (microtime(1) - $start) . "\n";
0.0011248588562012 
0.0017051696777344