2010-01-31 77 views
7

¿Cómo puedo eliminar un elemento de una matriz y reordenar después, sin tener un elemento vacío en la matriz?PHP | ¿Eliminar elemento de la matriz con reordenamiento?

<?php 
    $c = array(0=>12,1=>32); 
    unset($c[0]); // will distort the array. 
?> 

Respuesta/Solución: gama array_values ​​(gama $ entrada).

<?php 
    $c = array(0=>12,1=>32); 
    unset($c[0]); 
    print_r(array_values($c)); 
    // will print: the array cleared 
?> 

Respuesta

11
array_values($c) 

devolverá una nueva matriz con sólo los valores indexados de forma lineal.

4

Si siempre está eliminando el primer elemento, utilice array_shift() en lugar de unset().

De lo contrario, debería poder usar algo como $ a = array_values ​​($ a).

1

Si sólo se quita el primer elemento de la matriz, se puede usar array_shift($c);

-1

O reset(); es también una buena opción

+0

'reset();' no es, según PHP.net: "reset() rebobina array ' s puntero interno al primer elemento y devuelve el valor del primer elemento de la matriz ". – Harmen

+0

Ok Gracias, de hecho por su voto – streetparade

2

Otra opción sería array_splice(). Esto reordena las teclas numéricas y parece ser un método más rápido si está procesando datos suficientes para su cuidado. Pero me gusta unset() array_values ​​() para la legibilidad.

array_splice($array, $index, $num_elements_to_remove); 

http://php.net/manual/en/function.array-splice.php

Prueba de velocidad:

ArraySplice process used 7468 ms for its computations 
    ArraySplice spent 918 ms in system calls 
    UnsetReorder process used 9963 ms for its computations 
    UnsetReorder spent 31 ms in system calls 

Código de prueba:

function rutime($ru, $rus, $index) { 
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000)) 
    - ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000)); 
} 

function time_output($title, $rustart, $ru) { 
     echo $title . " process used " . rutime($ru, $rustart, "utime") . 
      " ms for its computations\n"; 
     echo $title . " spent " . rutime($ru, $rustart, "stime") . 
      " ms in system calls\n"; 
} 

$test = array(); 
for($i = 0; $i<100000; $i++){ 
     $test[$i] = $i; 
} 

$rustart = getrusage(); 
for ($i = 0; $i<1000; $i++){ 
     array_splice($test,90000,1); 
} 
$ru = getrusage(); 
time_output('ArraySplice', $rustart, $ru); 

unset($test); 
$test = array(); 
for($i = 0; $i<100000; $i++){ 
     $test[$i] = $i; 
} 

$rustart = getrusage(); 
for ($i = 0; $i<1000; $i++){ 
     unset($test[90000]); 
     $test = array_values($test); 
} 
$ru = getrusage(); 
time_output('UnsetReorder', $rustart, $ru); 
0

array_shift()turnos el primer valor de la matriz fuera y lo devuelve, acortando la matriz por un elemento y moviendo todo hacia abajo. Todas las teclas numéricas de la matriz se modificarán para comenzar a contar desde cero, mientras que las claves literales no se tocarán.

array_shift ($ stack);

ejemplo:

$stack = array("orange", "banana", "apple", "raspberry"); 
$fruit = array_shift($stack); 
print_r($stack); 

de salida:

Array 
(
    [0] => banana 
    [1] => apple 
    [2] => raspberry 
) 

Fuente: http://php.net/manual/en/function.array-shift.php

+0

Wow, usted es grande en copiar y pegar. Lea http://stackoverflow.com/help/how-to-answer –

+0

¡Gracias por eso! –

Cuestiones relacionadas