2009-11-17 15 views

Odpowiedz

8

To zależy:

$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 

Ogólnie unset() jest bezpieczny dla hashtables (String-tablice indeksowane), ale jeśli trzeba polegać na ciągłych indeksów numerycznych musisz użyć jednej array_splice() lub kombinacja unset() i array_values().

+1

Dlaczego używałbyś unset w połączeniu z wartościami array_values ​​zamiast array_splice? – John

+4

@John: Jeden scenariusz, o którym mogę pomyśleć to, kiedy chcesz usunąć kilka przedmiotów z jednej tablicy. Z 'unset()' -way możesz usunąć wartości bez myślenia o zmianie kluczy - jeśli skończysz, uruchom tablicę przez 'array_values ​​()' aby znormalizować indeksowanie. To jest czystsze i szybsze niż używanie 'array_splice()' kilka razy. –

9

Wspólna droga:

Według manual

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

przefiltrowanej sposób:

Istnieje również funkcja array_filter() dbać o tablicach filtrujących

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

Aby uzyskać indeks sekwencyjnym można korzystać

$numeric_data = array_values($numeric_data); 

Referencje
PHP – Delete selected items from an array

+0

Peter, dziękuję. – lovespring

5

To zależy. Jeśli chcesz usunąć element bez powodowania przerw w indeksach, trzeba użyć array_splice:

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

wyjściowa:

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

Korzystanie rozbrojony może pracować, ale wynika to w sposób nieciągły indeksu. Czasami może to być problem, jeśli iteracyjne nad tablicy przy użyciu count ($ A) - 1 jako miara górna granica:

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

wyjściowa:

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

Jak widać, liczba jest teraz 3, ale indeks ostatniego elementu jest również 3.

Moje zalecenie polega więc na użyciu array_splice dla tablic z indeksami numerycznymi, i użycie unset tylko dla tablic (naprawdę słowniki) z nieliczbowymi indeksami.

+0

alternatywnie możesz wywołać 'unset ($ a [2]); $ a = array_values ​​($ a); ' – nickf

Powiązane problemy