Pytanie PHP: Usuń element z tablicy


Czy istnieje prosty sposób na usunięcie elementu z tablicy za pomocą PHP, takie, że foreach ($array) nie zawiera już tego elementu?

Myślałem, że to ustawienie null zrobiłby to, ale najwyraźniej to nie działa.


1972
2017-12-15 20:28


pochodzenie


Nie chciałbym, aby odpowiedź Konrada była najprostsza do stwierdzonego problemu. Z unset() iteracje w tablicy nie będą zawierać już usuniętej wartości. OTOH, prawdą jest, że odpowiedź Stevana jest obszerna i właściwie była to odpowiedź, której szukałem - ale nie OP :) - brandizzi
@danip Łatwo znaleźć w instrukcji nie wyklucza pytanie na StackOverflow. Jeśli pytanie było duplikować Pytanie dotyczące StackOverflow, to może nie być tutaj. StackOverflow jest dobrym miejscem do znalezienia odpowiedzi jako opcji typu "go-to", nawet przed zapoznaniem się z instrukcją. - Dan Nissenbaum
@unset ($ array [$ key]); $ array = array_values ​​($ tablica); - trojan
Powiązane pytanie dotyczące usunięcia tego w pętli foreach: stackoverflow.com/questions/1949259/... - Legolas
Jeśli chcesz usunąć klucze z tablicy tablicowej (Tablica asocjacyjna), zobacz rozwiązanie na stronie stackoverflow.com/a/47978980/1045444 - Somnath Muluk


Odpowiedzi:


Istnieją różne sposoby na usunięcie elementu tablicy, w którym niektóre są bardziej przydatne dla niektórych zadań niż inne.

Usuń jeden element tablicy

Jeśli chcesz usunąć tylko jeden element tablicy, możesz go użyć unset() lub alternatywa array_splice().

Również jeśli masz wartość i nie znasz klucza do usunięcia elementu, którego możesz użyć array_search() zdobyć klucz.

unset() metoda

Zauważ, że kiedy używasz unset() klucze tablicy nie zmieniają / reindeksują. Jeśli chcesz ponownie zindeksować klucze, których możesz użyć array_values() po unset() która zamieni wszystkie klucze na wyliczone klawisze numeryczne, począwszy od 0.

Kod

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    unset($array[1]);
               //↑ Key which you want to delete

?>

Wydajność

Array (
    [0] => a
    [2] => c
)

array_splice() metoda

Jeśli użyjesz array_splice() klucze zostaną automatycznie ponownie zindeksowane, ale klucze skojarzone nie zmienią się w przeciwieństwie do array_values() który zamieni wszystkie klawisze na klawisze numeryczne.

Również array_splice() potrzebuje przesunięcia, a nie klucza! jako drugi parametr.

Kod

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    array_splice($array, 1, 1);
                       //↑ Offset which you want to delete

?>

Wydajność

Array (
    [0] => a
    [1] => c
)

array_splice() taki sam jak unset() przyjmuj tablicę przez odwołanie, to znaczy, że nie chcesz przypisać zwracanych wartości tych funkcji z powrotem do tablicy.

Usuń wiele elementów tablicy

Jeśli chcesz usunąć wiele elementów tablicy i nie chcesz zadzwonić unset() lub array_splice() wiele razy możesz korzystać z funkcji array_diff() lub array_diff_key() w zależności od tego, czy znasz wartości lub klucze elementów, które chcesz usunąć.

array_diff() metoda

Jeśli znasz wartości elementów tablicy, które chcesz usunąć, możesz użyć array_diff(). Tak jak poprzednio unset() nie zmieni / nie wyindeksuje kluczy tablicy.

Kod

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff($array, ["a", "c"]);
                              //└────────┘→ Array values which you want to delete

?>

Wydajność

Array (
    [1] => b
)

array_diff_key() metoda

Jeśli znasz klucze elementów, które chcesz usunąć, wtedy chcesz użyć array_diff_key(). Tutaj musisz upewnić się, że przekazujesz klucze jako klucze w drugim parametrze, a nie jako wartości. W przeciwnym razie musisz odwrócić tablicę za pomocą array_flip(). Również tutaj klucze nie ulegną zmianie / reindeksowi.

Kod

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                   //↑           ↑ Array keys which you want to delete
?>

Wydajność

Array (
    [1] => b
)

Także jeśli chcesz użyć unset() lub array_splice() aby usunąć wiele elementów o tej samej wartości, których możesz użyć array_keys() aby uzyskać wszystkie klucze dla określonej wartości, a następnie usunąć wszystkie elementy.


2229
2017-12-15 21:25



jeśli masz <? php $ x = array (1, 2, 3, 4); unset ($ x [2]); var_dump ($ x); // array (3) {[0] => int (0), [1] => int (2), [3] => int (4),}?> - Alexandru Rada
@AlexandruRada Nie, powiedziałeś "nie korzystaj z tego" - i to po prostu nonsens. Możesz bezpiecznie korzystać z tej metody, gdy traktujesz tablicę taką, jaka jest - słownik. Tylko jeśli spodziewasz się kolejnych indeksów numerycznych, musisz użyć czegoś innego. - Konrad Rudolph
@Alexander Użyj array_splice, jak opisano w innych odpowiedziach. - Konrad Rudolph
@AlexandruRada Nie ma mowy, że możesz array (3) { [0]=>int(0) ... kiedy ty unset($x[2]) od $x = array(1, 2, 3, 4); Wynik musi być var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } (prawdopodobnie było to literówka) - inemanja
array_filter to również opłacalna metoda. Szczególnie dobry, jeśli nie chcesz zmutować tablicy, ale także nie reindeks, co może być problemem z json_encode. php.net/manual/en/function.json-encode.php#94157 - dotnetCarpenter


Należy zauważyć że unset() zachowa indeksy nietknięte, czego można się spodziewać, używając indeksów łańcuchowych (tablica jako tablica ashtable), ale może to być dość zaskakujące, gdy mamy do czynienia z tablicami z indeksem całkowitym:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

Więc array_splice() może być użyty, jeśli chcesz znormalizować swoje liczby całkowite. Inną opcją jest użycie array_values() po unset():

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

1302
2017-08-02 15:57



Warto zauważyć, że gdy korzystasz z array_splice (), musisz znać OFFSET, a nie klucz, ale offset (!) Dowolnego elementu, który chcesz usunąć - Tom
@Tom: dla zwykłej tablicy (która jest stale indeksowana liczbą całkowitą), offset jest indeksem. To tam gdzie array_splice może mieć sens (między innymi). - Stefan Gehrig
Tak, oczywiście, ale tylko coś do zapamiętania, jeśli manipulujesz tablicą przed użyciem splice - Tom
Od prostego testu usuwania dużej ilości elementów z gigantycznej tablicy, array_splice wydaje się być dużo szybszy i mniej intensywny. Jest to zgodne z tym, czego się spodziewałem: array_values ​​() wydaje się tworzyć kopię tablicy, podczas gdy array_splice działa w miejscu. - Doug Kavendek
array_values ​​jest użytecznym podejściem, gdy usuwasz elementy w pętli i chcesz, aby indeksy były spójne, ale potem chcesz je skompresować po pętli. - Rorrik


  // our initial array  
   $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");  
  print_r($arr);

  // remove the elements who's values are yellow or red  
   $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);  

To jest wyjście z powyższego kodu:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

Teraz array_values ​​() będzie ładnie reindeksować tablicę numeryczną, ale usunie wszystkie ciągi znaków z tablicy i zastąpi je liczbami. Jeśli chcesz zachować nazwy kluczy (łańcuchy) lub ponownie wyindeksować tablicę, jeśli wszystkie klucze są liczbowe, użyj array_merge ():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

wyniki

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)

321
2017-11-15 11:29





$key = array_search($needle,$array);
if($key!==false){
    unset($array[$key]);
}

176
2017-12-15 20:31



Byłoby dobrze wyjaśnić, że ta odpowiedź służy do usuwania elementu, gdy znasz wartość, ale nie klucz. Zauważ, że usuwa tylko PIERWSZĄ instancję wartości; znaleźć wszystko klucze dla wartości, użyj array_keys - ToolmakerSteve


unset($array[$index]);

58
2017-11-26 08:25





Jeśli masz tablicę indeksowaną numerycznie, gdzie wszystkie wartości są unikalne (lub są nieunikalne, ale chcesz usunąć wszystkie wystąpienia określonej wartości), możesz po prostu użyć array_diff (), aby usunąć pasujący element, na przykład:

$my_array = array_diff($my_array, array('Value_to_remove'));

Na przykład:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Spowoduje to wyświetlenie:

4
3

W tym przykładzie element o wartości "Charles" jest usuwany, ponieważ można go zweryfikować za pomocą wywołań sizeof (), które zgłaszają rozmiar 4 dla początkowej tablicy, a 3 po usunięciu.


55
2017-07-31 01:06





W przypadku nazwanego elementu:

unset($array["elementName"]);


48
2017-07-19 15:37



$a = array("A"=>1, "B"=>2, "C"=>"a");  print_r($a);  unset($a["B"]);  print_r($a);  daje (sformatowany): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a ) - DefenestrationDay
Wygląda na to, że nie można anulować ustawienia elementów tablicy indeksowanych przez ciąg znaków (generuje "Błąd krytyczny: nie można usunąć przesunięć ciągów znaków"). Nie sądzę, że tak było zawsze, ale z pewnością od PHP 5.3.10 i prawdopodobnie wcześniej - carpii
@carpii PHP może usuwać elementy z tablicy asocjacyjnej. Błąd krytyczny powstaje przy próbie użycia unset ($ var ['key']) w łańcuchu zamiast tablicy Na przykład: $ array = array ('test' => 'value', 'another' => ' wartość ",); unset ($ array ['test']); // Usuwa element "testowy" z tablicy zgodnie z oczekiwaniami $ array = 'test'; unset ($ array ['test']); // Zgłasza "Błąd krytyczny: nie można usunąć przesunięć ciągów znaków" zgodnie z oczekiwaniami - Jimbo


Zniszcz jeden element tablicy

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

Dane wyjściowe będą:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

Jeśli potrzebujesz ponownie indeksować tablicę:

$array1 = array_values($array1);
var_dump($array1);

Następnie wynik będzie:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

Pop element z końca tablicy - zwraca wartość usuniętego elementu

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

Wyjście będzie

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

Usuń pierwszy element (czerwony) z tablicy, - zwraca wartość usuniętego elementu

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

Dane wyjściowe będą:

Array
(
    [b] => green
    [c] => blue
)
First Color: red

26
2018-06-11 05:51





<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Wydajność:

Array
(
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
)

fruit1

22
2017-09-22 04:01



Zauważ, że array_shift może usunąć tylko pierwszy element z tablicy. podobnie użyj array_pop aby usunąć ostatni element w tablicy. - Jasir
Odpowiedź dotyczy tylko pierwszego elementu tablicy i nie odpowiada na ogólne pytanie. - sweisgerber.dev
@ Sbweisgerber masz rację, ale nie sądzę, że jest to niewłaściwe i trzeba zignorować to ans. Pytanie to usuń element, nie wspominając o żadnej pozycji. - Saurabh Chandra Patel


Aby uniknąć szukania, można się bawić array_diff:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

W takim przypadku nie trzeba wyszukiwać / używać klucza.


20
2017-07-26 20:11





unset() niszczy określone zmienne.

Zachowanie unset() wewnątrz funkcji może się różnić w zależności od typu zmiennej, którą próbujesz zniszczyć.

Jeśli jest zglobalizowana zmienna unset() wewnątrz funkcji, tylko lokalna zmienna jest zniszczona. Zmienna w środowisku wywołującym zachowa taką samą wartość jak poprzednio unset() został wywołany.

<?php
function destroy_foo() 
{
    global $foo;
    unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?>

Odpowiedź powyższego kodu będzie bar

Do unset() zmienna globalna wewnątrz funkcji

<?php
function foo() 
{
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();
?>

13
2018-03-11 18:48