2010-07-12 37 views
44

Tôi đang viết foreach không bắt đầu tại chỉ mục thứ 0 mà thay vào đó bắt đầu từ chỉ mục đầu tiên của mảng của tôi. Có cách nào để bù đắp điểm khởi đầu của vòng lặp không?Cách bắt đầu vòng lặp foreach tại một chỉ mục cụ thể trong PHP

+12

nó Wouldnt là tốt hơn nếu bạn sử dụng FOR thay thế? – Prix

+3

Xử lý các cặp khóa-giá trị dễ dàng hơn rất nhiều trong vòng lặp foreach và tôi đoán đó là lý do mà anh ấy muốn kiếm tiền. Hoặc anh ấy thậm chí có một foreach và không muốn thay đổi rất nhiều mã. – 2ndkauboy

Trả lời

2

Trong một foreach bạn không thể làm điều đó. Chỉ có hai cách để có được những gì bạn muốn:

  1. Sử dụng một vòng lặp for và bắt đầu từ vị trí 1
  2. sử dụng một foreach và sử dụng một cái gì đó như if ($ key> 0) xung quanh mã thực tế của bạn

A foreach thực hiện tên của nó là gì. Làm điều gì đó cho mọi yếu tố :)

EDIT: OK, một giải pháp rất xấu đến với tâm trí của tôi. Hãy thử các cách sau:

foreach(array_reverse(array_pop(array_reverse($array))) as $key => $value){ 
    ... 
} 

Điều đó sẽ đảo ngược mảng, bật phần tử cuối cùng và đảo ngược lại. Hơn bạn sẽ có một phần tử không bao gồm phần tử đầu tiên.

Nhưng tôi khuyên bạn nên sử dụng một trong các giải pháp khác. Tốt nhất sẽ là người đầu tiên.

Và một biến thể: Bạn có thể sử dụng array_slice() cho rằng:

foreach(array_slice($array, 1, null, true) as $key => $value){ 
    ... 
} 

Nhưng bạn nên sử dụng cả ba thông số để giữ cho các phím của mảng cho vòng lặp foreach của bạn:

+0

sử dụng array_slice có thể thực hiện điều này trong vòng lặp foreach, nhưng thực hành đó nên được đánh giá cao và bị trừng phạt bởi phải đọc loại mã đó. – Kris

+0

Đó là lý do tại sao tôi chỉ ra rằng đó là một phương pháp EVIL để làm điều đó. Nhưng tôi sẽ không sử dụng bất kỳ cá nhân nào của Solutoin. Tôi sẽ sử dụng một câu lệnh if hoặc vòng lặp for. – 2ndkauboy

13

Bạn có thể sử dụng chức năng array_slice:

$arr = array(); // your array 
foreach(array_slice($arr, 1) as $foo){ 
    // do what ever you want here 
} 

Tất nhiên, bạn có thể sử dụng bất kỳ giá trị chênh lệch nào bạn muốn. Trong trường hợp này, 1 'bỏ qua' phần tử đầu tiên của mảng.

+0

Không có gì đáng giá để yêu cầu tạo một bản sao của mảng đó. Có thể là một điều xấu nếu mảng lớn. –

+0

Bạn đúng ... điều này sẽ hoạt động tốt hơn cho các mảng ngắn. Cám ơn bạn đã góp ý. – Cristian

1

Có vẻ như một vòng lặp for sẽ là cách tốt hơn để đi đây, nhưng nếu bạn nghĩ rằng bạn PHẢI sử dụng foreach bạn có thể thay đổi các yếu tố đầu tiên ra khỏi mảng và unshift nó trở lại:

$a = array('foo','bar'); 
$temp = array_shift($a); 
foreach ($a as $k => $v) { 
    //do something 
} 
array_unshift($a, $temp); 
+0

Chỉ cần lưu ý rằng cú pháp '$ k => $ v' chỉ dành cho mảng kết hợp. Đối với các mảng được lập chỉ mục, bạn chỉ muốn '$ a là $ v'. –

+0

@Michael: $ k => $ v cũng sẽ hoạt động đối với mảng được lập chỉ mục và trả về số chỉ mục của giá trị hiện tại. – 2ndkauboy

+0

Oh ... cool! : D lol –

67

Giữ nó đơn giản.

foreach ($arr as $k => $v) { 
    if ($k < 1) continue; 
    // your code here. 
} 
+1

Tôi thích giải pháp đó. Tiếp tục có sẵn với mọi phiên bản PHP không? – 2ndkauboy

+1

http://ie2.php.net/manual/en/control-structures.continue.php không đề cập đến khi nào nó có sẵn, vì vậy tôi cho rằng nó đã có ngay từ đầu. – TRiG

+1

và, nếu mảng không được lập chỉ mục? – Cristian

27

Một Foreach sẽ thiết lập lại các mảng:

Lưu ý: Khi foreach đầu tiên bắt đầu thực hiện, con trỏ mảng nội bộ được tự động thiết lập lại tới phần tử đầu tiên của mảng. Điều này có nghĩa là bạn không cần phải gọi reset() trước một vòng lặp foreach.

Hoặc sử dụng một vòng lặp for (chỉ nếu đây là không một mảng kết hợp)

$letters = range('a','z'); 
for($offset=1; $offset < count($letters); $offset++) { 
    echo $letters[$offset]; 
} 

hoặc một while vòng lặp (có thể là bất kỳ mảng)

$letters = range('a','z'); 
next($letters); 
while($letter = each($letters)) { 
    echo $letter['value']; 
} 

hoặc với một LimitIterator

$letters = new LimitIterator(new ArrayIterator(range('a','z')), 1); 
foreach($letters as $letter) { 
    echo $letter; 
} 

cho phép bạn chỉ định bù đắp bắt đầu và đếm thông qua hàm tạo.

Tất cả các ý trên sản lượng các chữ b để z thay vì a đến z

0

Cũng không có cơ thể nói nó nhưng nếu bạn không nhớ thay đổi mảng và nếu chúng ta muốn bắt đầu từ phần tử thứ hai của mảng:

unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 

nếu bạn làm tâm trí, chỉ cần thêm,

$saved = $array; 
unset($array[key($array)]); 
foreach($array as $key=>$value) 
{ 
    //do whatever 
} 
$array = $saved; 

Hơn nữa nếu bạn muốn bỏ qua một chỉ số nổi tiếng nhất định, chỉ subtitute

key($array) 

bởi chỉ số cho

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