Jak usunąć element tablicy, a następnie ponownie indeksować tablicę?

206

Mam pewne problemy z tablicą. Mam jedną tablicę, którą chcę zmodyfikować, jak poniżej. Chcę usunąć element (elementy) według indeksu, a następnie ponownie zindeksować tablicę. Czy to możliwe?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);
daGrevis
źródło

Odpowiedzi:

456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
Xzyfer
źródło
6
Właśnie to chciałem opublikować, +1.
Michiel Pater,
4
Jest to lepsze niż rozwiązanie deceze, jeśli trzeba usunąć kilka przedmiotów na raz - jeśli indeksy tych przedmiotów zostaną wcześniej zebrane. Gdy użyjesz tablicy_splice na pierwszym elemencie, tracisz indeksy pozostałych elementów.
Jānis Elmeris
23
Warto zauważyć, że można rozbroić wiele zmiennych / indeksów tablic w jednym rozbrojonym wywołaniuunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
bardzo fajne rozwiązanie bracie :)
Michael Kisilenko
Użyłem tego. Dziękuję Ci. Używałem array_splicei to nie działało dla 0-tego i 1-go wskaźnika.
theGreenCabbage
43
array_splice($array, 0, 1);

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

deceze
źródło
2
Uważaj na używanie tego w pętli, ponieważ powoduje to, że indeksy tablicy w pętli i rzeczywistej tablicy nie są zsynchronizowane.
Mouagip,
29

Lepiej użyj array_shift(). To zwróci pierwszy element tablicy, usunie go z tablicy i ponownie zindeksuje tablicę. Wszystko w jednej wydajnej metodzie.

Rene
źródło
2
Jest to w porządku, gdy chcesz pobrać, a następnie usunąć pierwszy element tablicy, ponownie indeksując tablicę w procesie. Funkcja odpowiednika array_pop()pobiera i usuwa ostatni element tablicy, jeśli jest to potrzebne. Jednak żadna z funkcji nie może działać tak, aby działała na element w środku tablicy.
Derrick Miller,
1
Chociaż jest to powiązane ortogonalnie, pytanie dotyczy wyraźnie dowolnego elementu tablicy, a nie tylko pierwszego.
Félix Gagnon-Grenier
10
array_splice($array, array_search(array_value, $array), 1);
użytkownik1092222
źródło
gdzie wartość_wartości będzie „cokolwiek”
1092222
9
Unset($array[0]); 

Sort($array); 

Nie wiem, dlaczego jest to lekceważone, ale jeśli ktoś zechce go wypróbować, zauważysz, że to działa. Użycie sortowania na tablicy powoduje ponowne przypisanie kluczy tablicy. Jedyną wadą jest to, że sortuje wartości. Ponieważ klucze zostaną oczywiście ponownie przypisane, nawet z array_values, nie ma znaczenia, czy wartości są sortowane, czy nie.

mroźny
źródło
9
nawet jeśli klucze zostaną ponownie przypisane, w prawidłowej odpowiedzi początkowa kolejność zostanie zachowana.
s3v3n
1
„Chcę usunąć element (elementy) według indeksu, a następnie ponownie zindeksować tablicę. Czy to możliwe?” @ s3v3n OP nigdy nie poprosił o utrzymanie początkowej kolejności. Po prostu podałem rozwiązanie, które działa i działa zgodnie z ustaleniami.
frostymarvellous
1
Pytanie ma 2 lata. Odpuść sobie!
s3v3n
@ s3v3n To nie jest uraza. Chciałbym tylko wiedzieć, dlaczego. Oczywiście do poprawienia w późniejszych odpowiedziach. Zgadzam się, że istnieją lepsze metody, ale czy istnieje powód, dla którego ta odpowiedź jest tak zła? Czy to wydajność? itp? Z tego samego powodu jestem na SO, aby uczyć się i uczyć.
frostymarvellous,
W normalnych okolicznościach jest bardzo prawdopodobne, że programista będzie potrzebował tych wartości w dokładnie takiej samej kolejności, jak dane wejściowe. Weźmy jako przykład niektóre wiersze z bazy danych, które powinny zostać wyświetlone w tabeli; lub aplikacja czatu, w której odpowiedzi powinny być w dokładnie tej samej kolejności. Liczba przykładów może być nieskończona, chodzi o to, że w większości przypadków kolejność musi być taka sama lub przynajmniej programista oczekiwałby takiej samej kolejności elementów w tablicy.
s3v3n
4

Spróbuj z:

$foo2 = array_slice($foo, 1);
hsz
źródło
Działa to tylko dla pierwszego elementu, a nie dla dowolnego.
Felix Kling
0

Oprócz odpowiedzi Xzyfera

Funkcja

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Posługiwać się

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Wynik

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }
RafaSashi
źródło
0

Jeśli użyjesz array_merge, spowoduje to ponowne indeksowanie kluczy. Podręcznik stanowi:

Wartości w tablicy wejściowej z klawiszami numerycznymi zostaną ponumerowane przy pomocy klawiszy inkrementujących zaczynających się od zera w tablicy wyników.

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

To tutaj znalazłem oryginalną odpowiedź.

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset ()

Richard Skinner
źródło