2009-11-17 7 views

Répondre

8

Cela dépend:

$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 

En général unset() est sans danger pour les tables de hachage (tableaux chaîne indexée-), mais si vous devez compter sur les index numériques continous vous devrez utiliser soit array_splice() ou une combinaison de unset() et array_values().

+1

Pourquoi utiliseriez-vous unset combiné avec array_values ​​plutôt que array_splice? – John

+4

@John: Un scénario auquel je peux penser est, lorsque vous voulez supprimer plusieurs éléments d'un tableau. Avec la méthode 'unset()' vous pouvez supprimer les valeurs sans avoir à penser à changer de clé - si vous avez terminé, exécutez le tableau à l'aide de 'array_values ​​()' pour normaliser l'indexation. C'est plus propre et plus rapide que d'utiliser 'array_splice()' plusieurs fois. –

9

La voie commune:

Selon le manual

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

La façon filtrée:

Il y a aussi la fonction array_filter() pour prendre soin de réseaux de filtrage

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

Pour obtenir un index séquentiel vous pouvez utiliser

$numeric_data = array_values($numeric_data); 

Références
PHP – Delete selected items from an array

+0

Peter, merci. – lovespring

5

Cela dépend. Si vous voulez supprimer un élément sans provoquer de lacunes dans les index, vous devez utiliser array_splice:

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

Sortie:

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

L'utilisation unset peut fonctionner, mais cela se traduit par un indice non continu. Cela peut parfois être un problème lorsque vous itérer sur le tableau en utilisant count ($ a) - 1 comme une mesure de la limite supérieure:

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

Sortie:

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

Comme vous le voyez, le nombre est maintenant 3 mais l'indice du dernier élément est également 3.

Ma recommandation est donc d'utiliser array_splice pour les tableaux avec des index numériques, et d'utiliser unsetet seulement pour les tableaux (dictionnaires vraiment) avec des index non numériques.

+0

alternativement, vous pouvez appeler 'unset ($ a [2]); $ a = array_values ​​($ a); ' – nickf

Questions connexes