2009-11-17 12 views

Respuesta

8

Eso depende:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3); 
unset($a1['b']); 
// array('a' => 1, 'c' => 3) 

$a2 = array(1, 2, 3); 
unset($a2[1]); 
// array(0 => 1, 2 => 3) 
// note the missing index 1 

// solution 1 for numeric arrays 
$a3 = array(1, 2, 3); 
array_splice($a3, 1, 1); 
// array(0 => 1, 1 => 3) 
// index is now continous 

// solution 2 for numeric arrays 
$a4 = array(1, 2, 3); 
unset($a4[1]); 
$a4 = array_values($a4); 
// array(0 => 1, 1 => 3) 
// index is now continous 

general unset() es seguro para tablas hash (arrays indexados cadena), pero si usted tiene que depender de los índices numéricos continuos que tendrá que utilizar array_splice() o una combinación de unset() y array_values().

+1

¿Por qué usaría unset combinado con array_values ​​en lugar de array_splice? – John

+4

@John: Un escenario en el que puedo pensar es cuando quieres eliminar varios elementos de una matriz. Con la ruta 'unset()', puede eliminar los valores sin tener que pensar en cambiar las claves; si ha terminado, ejecute la matriz a través de 'array_values ​​()' para normalizar la indexación. Eso es más limpio y más rápido que usar 'array_splice()' varias veces. –

9

La forma más común:

De acuerdo con la manual

unset($arr[5]); // This removes the element from the array 

La forma filtrada:

También existe la función array_filter() para cuidar de las matrices de filtrado

$numeric_data = array_filter($data, "is_numeric"); 

Para obtener un índice secuencial puede utilizar

$numeric_data = array_values($numeric_data); 

Referencias
PHP – Delete selected items from an array

+0

Peter, gracias. – lovespring

5

Depende. Si desea eliminar un elemento sin causar deficiencias en los índices, es necesario utilizar array_splice:

$a = array('a','b','c', 'd'); 
array_splice($a, 2, 1); 
var_dump($a); 

Salida:

array(3) { 
    [0]=> 
    string(1) "a" 
    [1]=> 
    string(1) "b" 
    [2]=> 
    string(1) "d" 
} 

Usando desarmar puede trabajar, pero esto resulta en un índice no continua. Esto a veces puede ser un problema cuando iterar sobre la matriz mediante recuento ($ a) - 1 como una medida de la cota superior:

$a = array('a','b','c', 'd'); 
unset($a[2]); 
var_dump($a); 

Salida:

array(3) { 
    [0]=> 
    string(1) "a" 
    [1]=> 
    string(1) "b" 
    [3]=> 
    string(1) "d" 
} 

Como se ve, el recuento es ahora 3 pero el índice del último elemento también es 3.

Mi recomendación es por lo tanto usar array_splice para matrices con índices numéricos, y usar unset solo para matrices (en realidad diccionarios) con índices no numéricos.

+0

alternativamente puede llamar 'unset ($ a [2]); $ a = array_values ​​($ a); ' – nickf

Cuestiones relacionadas