2011-03-21 13 views
24

Tengo valores en alguna gama Quiero volver índice de toda la matriz de modo que la clave del primer valor debe ser 1 en lugar de cero, es decircómo cambiar la clave de la matriz a partir de 1 en lugar de 0

Por defecto en PHP clave de la matriz comienza desde 0. 0 => a, 1=> b es decir, que quieren volver a indexar toda la matriz a partir de clave = 1, es decir 1=> a, 2=> b, ....

+3

¿Hay alguna razón por la que no puedas usar una matriz basada en cero? – Jacob

+0

@Jacob, por ejemplo, un bucle for que usa '% == 0' para definir las etiquetas' 'y' '. Un '$ i [0]' dispara el ''. De todos modos, así es como terminé en esta pregunta :) – JoshP

Respuesta

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

Editar: decidí referencia esta solución frente a otros planteados en este tema. Aquí está el código muy simple utilicé:

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

Y la salida:

0.0018711090087891 
0.0021598339080811 
0.0075368881225586 
+0

esto también es una buena técnica –

+0

Gracias Michael Mctirnan, –

+0

@ user569403 Recuerde aceptar ... –

-2

probar esto

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

simplemente puede hacer esto

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

Aquí está mi sugerencia:

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

El resultado del ejemplo sería:

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

Esta solución es más fácil y más rápida que la solución aceptada. – anasaitali

+0

Prefiero esta solución. – iamkeir

+4

¡Su respuesta ignora que no podemos elegir arbitrariamente el índice! De lo contrario, el problema no estaba allí! –

7

solución de Ricardo Miguel funciona mejor cuando se está definiendo la matriz y quiere la primera clave sea 1. Pero si la matriz ya está definido o se puso juntos en otra parte (función diferente o un bucle) se puede alterar de esta manera:

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

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

array_merge pondrá una matriz que contiene 1 elemento vacío y la otra matriz juntos, re-índices que, array_filter A continuación, retire los elementos de la matriz vacías ($array[0]), por lo que es empezar a 1.

+0

Prefiero tu solución que otras, ya que la solución de ricardo está pensada para la definición estática de array –

+0

Me gusta tu solución. – Aamir

+2

No, esta es una solución incorrecta, 'array_filter' eliminará todos los valores vacíos, no solo el elemento fusionado. Por ejemplo, si '$ array = array ('a', 'b', '');', perderá el 3er elemento, que debe conservarse. – Fishdrowned

1

Si está utilizando un rango, prueba este código:

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

el resultado:

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