2011-03-21 82 views
24

我有一些数组值开始我想重新索引整个阵列,使得第一个值的关键应该是,而不是1个零,即如何改变阵列键从1而不是0

默认在PHP从0即0 => a, 1=> b数组键启动,我要重新索引整个阵列从钥匙= 1即1=> a, 2=> b, ....

+3

是否有任何理由不能只使用基于零的数组? – Jacob 2011-03-21 05:45:06

+0

@Jacob,例如,使用'%== 0'来定义''和'​​'标签的for循环。 '$ i [0]'出发''。无论如何,这就是我最终在这个问题:) – JoshP 2013-12-12 15:19:42

回答

33
$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"; 

和输出:

0.0018711090087891 
0.0021598339080811 
0.0075368881225586 
+0

这也是很好的技术 – 2011-03-21 05:43:56

+0

谢谢Michael Mctirnan, – 2011-03-21 05:48:54

+0

@ user569403请记住,接受... – 2011-03-21 05:49:26

-2

试试这个

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

只要试试这个

$array = array("a","b","c"); 
array_unshift($array,""); 
unset($array[0]); 
35

这里是我的建议:

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

上面的例子将输出:

Array 
(
    [1] => a 
    [2] => b 
    [3] => c 
    [4] => d 
) 
+3

此解决方案比已接受的解决方案更加简单快捷。 – anasaitali 2013-08-28 10:50:12

+0

我更喜欢这个解决方案。 – iamkeir 2014-05-29 16:26:58

+4

您的回复忽略了我们不能任意选择索引!否则,问题不在那里! – 2014-08-02 13:23:39

7

里卡多米格尔的解决方案效果最好,当你确定你的阵列,并希望第一个关键是1.但是,如果你的阵列已经被定义或者被放一起别处(不同的功能或循环)可以对其进行更改这样的:

$array = array('a', 'b', 'c'); // defined elsewhere 

$array = array_filter(array_merge(array(0), $array)); 

array_merge会把含有1个空元件的阵列和其它阵列一起,重新索引它,然后0将移除空数组元素($array[0]),使其为1。

+0

我比其他人更喜欢你的解决方案,因为ricardo的解决方案是用于阵列的静态定义 – 2014-06-23 10:37:16

+0

我喜欢你的解决方案。 – Aamir 2016-04-26 09:08:09

+2

不,这是一个错误的解决方案,'array_filter'将删除所有空值,而不仅仅是合并的元素。例如,如果'$ array = array('a','b','');',你将失去第三个元素,它应该被保留。 – Fishdrowned 2017-06-07 12:49:18

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) 
-1
$array = array('a', 'b', 'c', 'd'); 
$array = array_combine(range(1, count($array)), array_values($array)); 
print_r($array); 

结果:

Array 
(
    [1] => a 
    [2] => b 
    [3] => c 
    [4] => d 
)