2010-05-17 49 views
15

Vì vậy, đây là mã của tôi:Bỏ đặt phần tử mảng bên trong một vòng lặp foreach

<?php 

$arr = array(array(2 => 5), 
      array(3 => 4), 
      array(7 => 10)); 

foreach ($arr as $v) { 
    $k = key($v); 
    if ($k > 5) { 
     // unset this element from $arr array 
    } 
} 

print_r($arr); 

// now I would like to get the array without array(7 => 10) member 

Như bạn thấy đấy, tôi bắt đầu với một loạt các phím duy nhất => mảng giá trị, tôi lặp qua mảng này và nhận được một chìa khóa của phần tử hiện tại (là một mảng đơn).

Tôi cần phải bỏ đặt các thành phần của mảng có khóa cao hơn 5, tôi có thể làm như thế nào? Tôi cũng có thể cần xóa các phần tử có giá trị nhỏ hơn 50 hoặc bất kỳ điều kiện nào khác. Về cơ bản tôi cần để có được một chìa khóa của mục mảng hiện tại mà chính nó là một mảng với một mục duy nhất.

+1

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

Trả lời

39
foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+1

facepalm ... tôi hoàn toàn quên về cú pháp $ k => $ v trong một khoảnh khắc, bộ nhớ của tôi ngày càng tồi tệ hơn. –

+1

Sự khác biệt trong việc sử dụng $ k và khóa ($ v), chúng không giống nhau? Chỉ cần hỏi vì mỗi ví dụ dưới đây cũng sử dụng khóa ($ v) không biết tại sao khi tôi nghĩ rằng $ k có thể được sử dụng trực tiếp. – Haider

+1

@ Haider Bạn chỉ hiểu lầm về 'khóa ($ v) 'đang được sử dụng cho cái gì. Nó lấy khóa của mảng phụ là '$ v', không phải bất kỳ khóa nào của mảng đang được lặp lại. Đối với phần tử đầu tiên, '$ k == 0',' $ v == mảng (2 => 5) ', và' khóa ($ v) == 2'. – cincodenada

2

Sử dụng key() để lấy khóa đầu tiên từ mảng phụ.

foreach($arr as $k => $v) { 
    if(key($v) > 5) { 
     unset($arr[$k]); 
    } 
} 
+0

Cho bất kỳ người nào đã bỏ phiếu này, tôi có thể hỏi tại sao không? – Amber

+0

Xin chào, bạn đã chỉnh sửa câu trả lời, sao chép câu trả lời của tôi :) – sasa

+0

Um, không, tôi thực sự không biết câu trả lời của bạn khi tôi chỉnh sửa câu trả lời của mình. Thực tế là hai câu trả lời giống nhau là nhiều hơn do thực tế là tính cơ bản của nhiệm vụ trong tay dẫn đến việc nó được thực hiện theo cùng một cách bởi nhiều người (bên trong vòng lặp cơ bản giống như trước khi tôi chỉnh sửa nó; bên ngoài là khá nhiều tiêu chuẩn cho các vòng 'foreach'). – Amber

0

Nó không thực sự an toàn để thêm hoặc xóa từ một bộ sưu tập trong khi iterating qua nó. Làm thế nào về việc thêm các yếu tố bạn muốn một mảng thứ hai, sau đó bán phá giá bản gốc?

+2

Vòng lặp foreach' trong PHP lặp lại trên một bản sao của mảng được cung cấp theo mặc định (trừ khi nó được chuyển qua tham chiếu một cách rõ ràng). – Amber

+1

tham chiếu so với bản sao không phải là quan điểm của tôi, cũng không liên quan. nó là hình thức xấu để biến đổi một mảng trong quá trình lặp. –

+0

Nhưng, tại sao không an toàn? – sasa

14

an toàn trong PHP để loại bỏ các yếu tố từ một mảng trong khi iterating trên nó bằng cách sử lặp foreach:

foreach ($arr as $key => $value) { 
    if (key($value) > 5) { 
     unset($arr[$key]); 
    } 
} 
+2

Lưu ý rằng điều này không thực sự làm những gì OP muốn (nhưng điểm của bạn hầu như là chính xác - an toàn để làm như vậy trong ngữ cảnh của vòng lặp 'foreach'; các dạng lặp lại khác không phải lúc nào cũng thêm/xóa an toàn) . – Amber

+0

@Amber, cảm ơn bạn, tôi đã bỏ lỡ thực tế rằng mảng mảng được đưa ra, tôi đã sửa lại ví dụ. Cũng đã thêm ghi chú về vòng lặp 'foreach'. –

0

Để unset phần tử mảng, chúng tôi sử dụng unset() và chức năng php như dưới đây:

foreach($array as $key=>$value) 
{ 
    if(key($value) > 5) 
    { 
     unset($array[$key]); 
    } 
} 
Các vấn đề liên quan