2009-04-24 53 views
6

tôi muốn làm một cái gì đó như thế này:Cách thanh lịch nhất để làm "foreach x except y" trong PHP là gì?

foreach ($array as $key=>$value except when $key="id") 
{ 
// whatever 

} 

... mà không cần phải đặt dấu "nếu" điều khoản bên trong cơ thể của vòng lặp. Nó không được đảm bảo rằng "id" sẽ là phần tử đầu tiên hoặc cuối cùng trong mảng, và tôi không thực sự muốn bỏ đặt hoặc cắt mảng, bởi vì đó sẽ là tốn kém, xấu xí và không duy trì dữ liệu gốc. Tôi cũng chắc chắn cần phải sử dụng cả khóa và giá trị bên trong vòng lặp.

Bất kỳ ý tưởng nào?

Trả lời

14

Tôi không nghĩ rằng mệnh đề nếu là một vấn đề như vậy:

foreach ($array as $key => $value) { 
    if ($key == 'ignore_me') continue; 
    if ($key == 'ignore_me_2') continue; 

Nếu bạn muốn có một giải pháp ưa thích, bạn có thể sử dụng array_diff_key:

$loop_array = array_diff_key($actual_array, array('ignore_me' => NULL, 'ignore_me_2' => NULL)); 
foreach ($loop_array as $key => $value) { 
    #... 
+1

sẽ hoạt động, nhưng yêu cầu ngăn xếp nhiều bộ nhớ hơn vì nó tạo ra một bản sao của mảng đó. – Alnitak

+0

có vẻ đắt tiền ... – Thilo

+0

Có, thay đổi câu trả lời để phản ánh điều đó. – soulmerge

2

Tôi nghĩ bạn sẽ luôn luôn sử dụng mệnh đề IF trong vòng lặp bên trong. Trong tất cả các tùy chọn bạn đã cung cấp, đó là tùy chọn duy nhất tôi sử dụng cho tốc độ và mức tiêu thụ bộ nhớ

1

AFAIK bạn không thể thực hiện điều đó khi không có if trong vòng lặp.

Giống như từ khóa cho biết, đó là "cho mỗi từ khóa", không phải "cho hầu hết".

EDIT: như soulmerge nói, bạn có thể làm điều đó với array_diff_key(), nhưng nếu bạn chỉ bỏ lỡ một chìa khóa duy nhất đó là tiết hơn và ít bộ nhớ hiệu quả hơn là chỉ đặt if trong vòng lặp.

5

Go với if- mệnh đề bên trong vòng lặp. Không có gì không thích hợp về nó, nó là dễ đọc và dễ hiểu nhất, và nó là hiệu quả nhất.

Nếu bạn có nhiều phím để bỏ qua bạn có thể xây dựng một băm thứ hai để kiểm tra chống lại (trong mệnh đề if-):

foreach ($array as $key => $value) { 
    if (array_key_exists($key,$skip_keys)) continue; 
    ... 
} 
0

Một cách khác để nén các tuyên bố if là:

// ignore 1,5,8,9 
foreach($arr as $key){ 
    if(in_array($key, array(1,5,8,9)) continue; 
    ... 
} 
Các vấn đề liên quan