2010-02-21 80 views
111

Tôi lặp qua một mảng các đối tượng và muốn xóa một trong các đối tượng dựa trên thuộc tính 'id' của nó, nhưng mã của tôi không hoạt động.Làm thế nào để xóa đối tượng khỏi mảng bên trong vòng lặp foreach?

foreach($array as $element) { 
    foreach($element as $key => $value) { 
     if($key == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($element);//this doesn't work 
      unset($array,$element);//neither does this 
     } 
    } 
} 

Mọi đề xuất. Cảm ơn.

+2

thể trùng lặp của [Làm thế nào để bạn loại bỏ một phần tử mảng trong một foreach loop?] (http://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element-in-a-foreach-loop) – 7hi4g0

Trả lời

181
foreach($array as $elementKey => $element) { 
    foreach($element as $valueKey => $value) { 
     if($valueKey == 'id' && $value == 'searched_value'){ 
      //delete this particular object from the $array 
      unset($array[$elementKey]); 
     } 
    } 
} 
+46

Có an toàn khi loại bỏ một phần tử của một mảng trong vòng lặp foreach của cùng một mảng không? –

+14

@Oliver: thường nó sẽ tạo ra hành vi bất ngờ, nhưng bạn có thể làm điều đó một cách an toàn với foreach trên php. Cung cấp cho một đọc ở đây cho một thử nghiệm: http://php.net/manual/en/control-structures.foreach.php#88578 – pangon

+0

Đây là chuyển đổi mảng của tôi để đối tượng trong CodeIgniter. Bất kì lời đề nghị nào? – Paritosh

1

Tôi không phải là một lập trình viên php, nhưng tôi có thể nói rằng trong C# bạn không thể sửa đổi một mảng trong khi lặp qua nó. Bạn có thể muốn thử sử dụng vòng lặp foreach của bạn để xác định chỉ mục của phần tử hoặc các phần tử cần xóa, sau đó xóa các phần tử sau vòng lặp.

+12

Mặc dù thực tế không tốt trong hầu hết các ngôn ngữ, mảng trong PHP là các mảng liên kết cơ bản có thể được lặp lại theo thứ tự. Xóa một phần tử trước đó không thay đổi các khóa của các phần tử đi sau nó. –

+19

Trên thực tế, nó được cho phép bởi vì mảng foreach sử dụng nội bộ là một bản sao của mảng ban đầu. Bằng cách đó, sửa đổi mảng ban đầu là hoàn toàn an toàn. – Juan

+58

Trên thực tế, nó được cho phép bởi vì php là screwy như tất cả các địa ngục. –

1

Dường như cú pháp của bạn để bỏ đặt không hợp lệ và việc thiếu reindexing có thể gây ra sự cố trong tương lai. Xem: the section on PHP arrays.

Cú pháp chính xác được hiển thị ở trên. Đồng thời, hãy ghi nhớ array-values để lập chỉ mục lại, vì vậy bạn không bao giờ lập chỉ mục thứ gì đó bạn đã xóa trước đây.

1

này nên làm các trick .....

reset($array); 
while (list($elementKey, $element) = each($array)) { 
    while (list($key, $value2) = each($element)) { 
     if($key == 'id' && $value == 'searched_value') { 
      unset($array[$elementKey]); 
     } 
    } 
} 
4

Bạn cũng có thể sử dụng tài liệu tham khảo trên foreach giá trị:

foreach($array as $elementKey => &$element) { 
    // $element is the same than &$array[$elementKey] 
    if (isset($element['id']) and $element['id'] == 'searched_value') { 
     unset($element); 
    } 
} 
+4

$ phần tử (được sử dụng trong và ngoài của foreach) chỉ là một tham chiếu đến từng phần tử trong mảng. unset ($ element) sẽ chỉ phá vỡ tham chiếu, nó không phá hủy phần tử được tham chiếu từ mảng của nó. – Nicholas

+1

Nhưng '$ element = null' sẽ hoạt động? –

+1

@Dev_NIX '$ element = null' sẽ KHÔNG hoạt động, độ dài của' $ array' vẫn giữ nguyên, nó sẽ chỉ chứa các giá trị rỗng –

Các vấn đề liên quan