Câu hỏi PHP: Xóa một phần tử khỏi một mảng


Có cách dễ dàng để xóa một phần tử từ một mảng bằng cách sử dụng PHP, như vậy mà foreach ($array) không còn bao gồm yếu tố đó nữa?

Tôi nghĩ rằng đặt nó vào null sẽ làm điều đó, nhưng dường như nó không hoạt động.


1972
2017-12-15 20:28


gốc


Tôi không phải là câu trả lời của Konrad là câu trả lời đơn giản nhất cho vấn đề đã nêu. Với unset() các lần lặp qua mảng sẽ không bao gồm giá trị đã xóa nữa. OTOH, đúng là câu trả lời của Stevan rất dồi dào và, thực sự, là câu trả lời tôi đang tìm kiếm - nhưng không phải là OP :) - brandizzi
@danip Dễ dàng tìm thấy trong hướng dẫn không loại trừ một câu hỏi trên StackOverflow. Nếu câu hỏi là bản sao Câu hỏi StackOverflow, sau đó nó có thể không thuộc về đây. StackOverflow là một nơi tốt để tìm câu trả lời dưới dạng tùy chọn truy cập ngay cả trước khi xem trong hướng dẫn sử dụng. - Dan Nissenbaum
@unset ($ array [$ key]); $ array = array_values ​​($ array); - trojan
Câu hỏi liên quan về việc xóa mục này trong vòng lặp foreach: stackoverflow.com/questions/1949259/… - Legolas
Nếu bạn muốn loại bỏ các khóa khỏi mảng mảng (mảng kết hợp), xem giải pháp tại stackoverflow.com/a/47978980/1045444 - Somnath Muluk


Các câu trả lời:


Có nhiều cách khác nhau để xóa phần tử mảng, trong đó một số phần tử hữu ích hơn đối với một số tác vụ cụ thể hơn các tác vụ khác.

Xóa một phần tử mảng

Nếu bạn muốn xóa chỉ một phần tử mảng, bạn có thể sử dụng unset() hoặc thay thế array_splice().

Ngoài ra nếu bạn có giá trị và không biết chìa khóa để xóa phần tử bạn có thể sử dụng array_search() để lấy chìa khóa.

unset() phương pháp

Lưu ý rằng khi bạn sử dụng unset() các phím mảng sẽ không thay đổi / reindex. Nếu bạn muốn reindex các phím bạn có thể sử dụng array_values() sau unset() sẽ chuyển đổi tất cả các khóa thành các phím được liệt kê bằng số bắt đầu từ 0.

Mã số

<?php

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

?>

Đầu ra

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

array_splice() phương pháp

Nếu bạn dùng array_splice() các phím sẽ được tự động reindexed, nhưng các phím kết hợp sẽ không thay đổi như trái ngược với array_values() sẽ chuyển đổi tất cả các khóa thành các phím số.

Cũng thế array_splice() cần bù đắp, không phải chìa khóa! làm tham số thứ hai.

Mã số

<?php

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

?>

Đầu ra

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

array_splice() giống như unset() lấy mảng theo tham chiếu, điều này có nghĩa là bạn không muốn gán các giá trị trả về của các hàm đó trở lại mảng đó.

Xóa nhiều phần tử mảng

Nếu bạn muốn xóa nhiều phần tử mảng và không muốn gọi unset() hoặc là array_splice() nhiều lần bạn có thể sử dụng các chức năng array_diff() hoặc là array_diff_key() tùy thuộc vào nếu bạn biết các giá trị hoặc các phím của các yếu tố mà bạn muốn xóa.

array_diff() phương pháp

Nếu bạn biết giá trị của các phần tử mảng mà bạn muốn xóa, thì bạn có thể sử dụng array_diff(). Như trước đây unset() nó sẽ không thay đổi / reindex các phím của mảng.

Mã số

<?php

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

?>

Đầu ra

Array (
    [1] => b
)

array_diff_key() phương pháp

Nếu bạn biết các phím của các yếu tố mà bạn muốn xóa, thì bạn muốn sử dụng array_diff_key(). Ở đây bạn phải chắc chắn rằng bạn vượt qua các phím như các phím trong tham số thứ hai và không phải là giá trị. Nếu không, bạn phải lật mảng bằng array_flip(). Và cũng ở đây các phím sẽ không thay đổi / reindex.

Mã số

<?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
?>

Đầu ra

Array (
    [1] => b
)

Ngoài ra nếu bạn muốn sử dụng unset() hoặc là array_splice() để xóa nhiều phần tử có cùng giá trị bạn có thể sử dụng array_keys() để có được tất cả các khóa cho một giá trị cụ thể và sau đó xóa tất cả các phần tử.


2229
2017-12-15 21:25



nếu bạn có <? php $ x = mảng (1, 2, 3, 4); unset ($ x [2]); var_dump ($ x); // mảng (3) {[0] => int (0), [1] => int (2), [3] => int (4),}?> - Alexandru Rada
@AlexandruRada Không, bạn đã nói “không sử dụng cái này” - và điều đó thật vô nghĩa. Bạn có thể sử dụng một cách an toàn phương pháp này khi bạn xử lý một mảng như nó là gì - một từ điển. Chỉ khi bạn đang mong đợi các chỉ số số liên tiếp, bạn cần phải sử dụng cái gì khác. - Konrad Rudolph
@Alexander Sử dụng array_splice, như được mô tả trong các câu trả lời khác. - Konrad Rudolph
@AlexandruRada Không có cách nào bạn có thể có array (3) { [0]=>int(0) ... khi bạn unset($x[2]) từ $x = array(1, 2, 3, 4); Kết quả phải được var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } (có lẽ đó là lỗi đánh máy) - inemanja
array_filter cũng là một phương thức khả thi. Đặc biệt tốt nếu bạn không muốn biến đổi mảng nhưng nó cũng không reindex mà có thể là một vấn đề với json_encode. php.net/manual/en/function.json-encode.php#94157 - dotnetCarpenter


Cần lưu ý rằng unset() sẽ giữ cho các chỉ mục bị ảnh hưởng, đó là những gì bạn mong đợi khi sử dụng các chỉ mục chuỗi (mảng như hashtable), nhưng có thể khá ngạc nhiên khi xử lý các mảng được lập chỉ mục số nguyên:

$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)
} */

Vì thế array_splice() có thể được sử dụng nếu bạn muốn chuẩn hóa các phím số nguyên của mình. Một tùy chọn khác đang sử dụng array_values() sau 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



Cần lưu ý rằng khi bạn đang sử dụng array_splice (), bạn cần phải biết OFFSET, không phải khóa, nhưng offset (!) Của bất kỳ phần tử nào bạn muốn loại bỏ - Tom
@Tom: Đối với một mảng thường xuyên (đó là liên tục số nguyên chỉ mục) bù đắp là chỉ mục. Đó là nơi array_splice có thể có ý nghĩa (trong số những người khác). - Stefan Gehrig
Có tất nhiên, nhưng chỉ cần một cái gì đó để nhớ nếu bạn giả mạo với mảng trước khi sử dụng mối nối - Tom
Từ một thử nghiệm cơ bản về việc xóa một tấn phần tử từ một mảng khổng lồ, array_splice có vẻ nhanh hơn và ít tốn nhiều bộ nhớ hơn. Điều này phù hợp với những gì tôi mong đợi: array_values ​​() dường như đang tạo một bản sao của mảng, trong khi mảng_splice hoạt động tại chỗ. - Doug Kavendek
array_values ​​là một cách tiếp cận hữu ích khi bạn đang loại bỏ các phần tử trong một vòng lặp và muốn các chỉ mục nhất quán, nhưng sau đó muốn nén chúng ra sau vòng lặp. - 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);  

Đây là đầu ra từ đoạn mã trên:

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
)

Bây giờ, array_values ​​() sẽ reindex một mảng số độc đáo, nhưng sẽ loại bỏ tất cả các chuỗi khóa từ mảng và thay thế chúng bằng các số. Nếu bạn cần phải bảo toàn các tên khóa (chuỗi), hoặc reindex mảng nếu tất cả các phím là số, sử dụng array_merge ():

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

đầu ra

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



Sẽ là tốt để làm rõ rằng câu trả lời này là để xóa một phần tử, khi bạn biết giá trị, nhưng không phải là chìa khóa. Lưu ý rằng nó chỉ xóa dụ FIRST của giá trị; để tìm tất cả các khóa cho một giá trị, sử dụng array_keys - ToolmakerSteve


unset($array[$index]);

58
2017-11-26 08:25





Nếu bạn có một mảng được lập chỉ mục bằng số mà tất cả các giá trị là duy nhất (hoặc chúng không phải là duy nhất nhưng bạn muốn loại bỏ tất cả các phiên bản của một giá trị cụ thể), bạn có thể sử dụng array_diff () để loại bỏ một phần tử phù hợp, như sau:

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

Ví dụ:

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

Điều này sẽ hiển thị như sau:

4
3

Trong ví dụ này, phần tử có giá trị 'Charles' bị xóa vì có thể được xác minh bởi các cuộc gọi sizeof () báo cáo kích thước 4 cho mảng ban đầu và 3 sau khi xóa.


55
2017-07-31 01:06





Ngoài ra, đối với phần tử được đặt tên:

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);  cho (được định dạng): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a ) - DefenestrationDay
Có vẻ như bạn không thể bỏ đặt các phần tử mảng được lập chỉ mục bởi một chuỗi (tạo ra "Lỗi nghiêm trọng: Không thể bỏ đặt bù trừ chuỗi"). Tôi không nghĩ rằng đây luôn là trường hợp, nhưng chắc chắn là của PHP 5.3.10 và có thể sớm hơn - carpii
@carpii PHP có thể bỏ đặt các phần tử từ một mảng kết hợp. Lỗi gây tử vong được gây ra khi bạn cố gắng sử dụng unset ($ var ['key']) trên một chuỗi thay vì một mảng Ví dụ: $ array = array ('test' => 'value', 'another' => ' giá trị', ); unset ($ array ['test']); // Loại bỏ phần tử "test" khỏi mảng như mong đợi $ array = 'test'; unset ($ array ['test']); // Ném "Lỗi nghiêm trọng: Không thể bỏ đặt bù trừ chuỗi" như mong đợi - Jimbo


Phá hủy một phần tử duy nhất của một mảng

unset()

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

Đầu ra sẽ là:

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

Nếu bạn cần lập lại chỉ mục mảng:

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

Sau đó, đầu ra sẽ là:

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

Bật phần tử ra khỏi phần cuối của mảng - trả về giá trị của phần tử đã xóa

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

Đầu ra sẽ là

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

Loại bỏ phần tử đầu tiên (màu đỏ) khỏi một mảng, - trả về giá trị của phần tử đã xóa

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);

Đầu ra sẽ là:

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;
?>

Đầu ra:

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

fruit1

22
2017-09-22 04:01



Lưu ý rằng array_shift chỉ có thể xóa phần tử đầu tiên trong mảng. sử dụng tương tự array_pop để xóa phần tử cuối cùng trong mảng. - Jasir
Câu trả lời chỉ áp dụng cho phần tử đầu tiên của một mảng và không trả lời câu hỏi chung. - sweisgerber.dev
@sebweisgerber bạn là đúng nhưng tôi không nghĩ rằng đó là sai ans và cần phải downvote ans này. Câu hỏi là xóa một phần tử không đề cập đến bất kỳ vị trí nào. - Saurabh Chandra Patel