PHP Xóa các phần tử khỏi mảng kết hợp


100

Tôi có một mảng PHP trông giống như sau:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                2       Assigned
[2]                3       In Progress
[3]                4       Completed
[4]                5       Mark As Spam

Khi tôi var_dump các giá trị mảng tôi nhận được:

array(5) { [0]=> array(2) { ["key"]=> string(1) "1" ["value"]=> string(25) "Awaiting for Confirmation" } [1]=> array(2) { ["key"]=> string(1) "2" ["value"]=> string(9) "Assigned" } [2]=> array(2) { ["key"]=> string(1) "3" ["value"]=> string(11) "In Progress" } [3]=> array(2) { ["key"]=> string(1) "4" ["value"]=> string(9) "Completed" } [4]=> array(2) { ["key"]=> string(1) "5" ["value"]=> string(12) "Mark As Spam" } }

Tôi muốn xóa Đã hoàn thànhĐánh dấu là Thư rác . Tôi biết tôi có thể unset[$array[3],$array[4]), nhưng vấn đề là đôi khi số chỉ mục có thể khác.

Có cách nào để loại bỏ chúng bằng cách đối sánh tên giá trị thay vì giá trị khóa không?


không chắc liệu tôi có hiểu câu hỏi ở đây không? Ý bạn là gì đôi khi số chỉ mục có thể khác nhau?
Simon H

Câu trả lời:


153

Mảng của bạn khá lạ: tại sao không sử dụng keychỉ số as, và valuegiá trị là ...?

Sẽ không dễ dàng hơn nhiều nếu mảng của bạn được khai báo như thế này:

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);

Điều đó sẽ cho phép bạn sử dụng các giá trị của mình key làm chỉ mục để truy cập vào mảng ...

Và bạn có thể sử dụng các hàm để tìm kiếm các giá trị, chẳng hạn như array_search():

$indexCompleted = array_search('Completed', $array);
unset($array[$indexCompleted]);

$indexSpam = array_search('Mark As Spam', $array);
unset($array[$indexSpam]);

var_dump($array);

Dễ hơn với mảng của bạn, phải không?



Thay vào đó, với mảng của bạn trông giống như sau:

$array = array(
    array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
    array('key' => 2, 'value' => 'Asssigned'), 
    array('key' => 3, 'value' => 'In Progress'), 
    array('key' => 4, 'value' => 'Completed'), 
    array('key' => 5, 'value' => 'Mark As Spam'), 
);

Bạn sẽ phải lặp lại tất cả các mục, để phân tích valuevà bỏ đặt các mục phù hợp:

foreach ($array as $index => $data) {
    if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
        unset($array[$index]);
    }
}
var_dump($array);

Ngay cả khi do-can, nó không đơn giản như vậy ... và tôi nhấn mạnh: bạn có thể không thay đổi định dạng mảng của mình để làm việc với hệ thống khóa / giá trị đơn giản hơn không?


"Bạn sẽ phải lặp lại tất cả các mục để phân tích giá trị". Khi bạn đang sử dụng array_search, bạn cũng có thể tìm kiếm qua tất cả các mục.
Nicolas Aoki

96
  ...

  $array = array(
      1 => 'Awaiting for Confirmation', 
      2 => 'Asssigned', 
      3 => 'In Progress', 
      4 => 'Completed', 
      5 => 'Mark As Spam', 
  );



  return array_values($array);
  ...

3
Cảm ơn, tôi chỉ tìm kiếm cái này.! :)
Ravi Dhoriya ツ

2
tốt đẹp và dễ dàng . chỉ đang tìm kiếm cái này
Faisal Mehmood Awan

Đây là câu trả lời đúng, không phải đã được kiểm tra.
A.Seddighi

16
$key = array_search("Mark As Spam", $array);
unset($array[$key]);

Đối với mảng 2D ...

$remove = array("Mark As Spam", "Completed");
foreach($arrays as $array){
    foreach($array as $key => $value){
        if(in_array($value, $remove)) unset($array[$key]);
    }
}


3

Tại sao không sử dụng array_diff?

$array = array(
    1 => 'Awaiting for Confirmation', 
    2 => 'Asssigned', 
    3 => 'In Progress', 
    4 => 'Completed', 
    5 => 'Mark As Spam', 
);
$to_delete = array('Completed', 'Mark As Spam');
$array = array_diff($array, $to_delete);

Chỉ cần lưu ý rằng mảng của bạn sẽ được lập chỉ mục lại.


1

Thử cái này:

$keys = array_keys($array, "Completed");

/ edit Như JohnP đã đề cập, phương pháp này chỉ hoạt động đối với các mảng không lồng nhau.


0

Cách thực hiện việc này để lấy mảng đích lồng nhau của bạn và sao chép nó trong một bước duy nhất vào một mảng không lồng nhau. Xóa (các) khóa và sau đó gán mảng đã cắt cuối cùng cho nút lồng nhau của mảng trước đó. Đây là một đoạn mã để làm cho nó đơn giản:

$temp_array = $list['resultset'][0];

unset($temp_array['badkey1']);
unset($temp_array['badkey2']);

$list['resultset'][0] = $temp_array;

0

Tôi hơi không đồng ý với câu trả lời được chấp nhận. Đôi khi kiến ​​trúc ứng dụng không muốn bạn làm rối với id mảng hoặc gây bất tiện. Ví dụ: tôi sử dụng CakePHP khá nhiều và một truy vấn cơ sở dữ liệu trả về khóa chính dưới dạng giá trị trong mỗi bản ghi, tương tự như ở trên.

Giả sử mảng không quá lớn, tôi sẽ sử dụng array_filter. Thao tác này sẽ tạo một bản sao của mảng, trừ đi các bản ghi bạn muốn loại bỏ, mà bạn có thể gán lại cho biến mảng ban đầu.

Mặc dù điều này có vẻ không hiệu quả nhưng thực tế ngày nay nó rất thịnh hành khi các biến là bất biến và thực tế là hầu hết các hàm mảng php trả về một mảng mới thay vì tương lai với mảng ban đầu ngụ ý rằng PHP cũng muốn bạn làm điều này. Và bạn càng làm việc nhiều với mảng và nhận ra hàm unset () khó và gây phiền nhiễu như thế nào, thì cách làm này rất có ý nghĩa.

Dù sao:

$my_array = array_filter($my_array, 
                         function($el) { 
                            return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                         });

Bạn có thể sử dụng bất kỳ logic bao gồm nào (ví dụ: trường id của bạn) trong hàm nhúng mà bạn muốn.


-1

để sử dụng một mảng đơn lẻ reset($item)


Hàm đặt lại nên được sử dụng để di chuyển con trỏ mảng bên trong, không phải để xóa các mục hoặc hủy đặt các mục khỏi một mảng. Thay vào đó, hãy sử dụng unset. Nếu giải pháp của bạn thậm chí hoạt động, nó cũng có những tác dụng phụ không mong muốn.
David
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.