2013-12-09 16 views
11

Tôi đang tìm cách để có cặp cặp/giá trị tiếp theo + 1 tiếp theo trong một foreach(). Ví dụ:Mảng PHP nhận khóa/giá trị tiếp theo trong foreach()

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

foreach($a AS $k => $v){ 

    if($nextval == $v && $nextnextval == $v){ 
     //staying put for next two legs 
    } 

} 
+0

Đây là giải pháp có thể hoạt động: http://stackoverflow.com/a/5096852/1022697 – qwertynl

+0

Tôi sẽ tạo trình vòng lặp tùy chỉnh cho điều đó. –

Trả lời

8

Bạn không thể truy cập theo cách đó các giá trị tiếp theo và tiếp theo.

Nhưng bạn có thể làm điều gì đó tương tự:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

$keys = array_keys($a); 
foreach(array_keys($keys) AS $k){ 
    $this_value = $a[$keys[$k]]; 
    $nextval = $a[$keys[$k+1]]; 
    $nextnextval = $a[$keys[$k+2]]; 

    if($nextval == $this_value && $nextnextval == $this_value){ 
     //staying put for next two legs 
    } 
} 
+0

Tôi đã sử dụng điều này mặc dù nó không trả lời câu hỏi của tôi 100% – danielb

-2

Funny, tôi lập trình PHP trong một thập kỷ (với nhiều năm tạm dừng), nhưng tôi cần chức năng đi bộ một-by-one chỉ một tuần trước đây.

Đây là: next, trước tiên, đặt lại v.v. Xem phần "xem thêm". Ngoài ra, kiểm tra array_keys()

0

Có một cái nhìn tại CachingIterator, như mô tả trong câu trả lời này:

Peek ahead when iterating an array in PHP

Hoặc sử dụng array_keys() là một câu trả lời gửi cho cùng một câu hỏi, ví dụ

$keys = array_keys($array); 
for ($i = 0; $i < count($keys); $i++) { 
    $cur = $array[$keys[$i]]; 
    $next = $array[$keys[$i+1]]; 
} 
1

Dưới đây là một cách để làm điều đó:

while($current = current($a)) { 
    $next = next($a); 
    $nextnext = next($a); 

    // Comparison logic here 

    prev($a); // Because we moved the pointer ahead twice, lets back it up once 
} 

Ví dụ: http://3v4l.org/IGCXW

Lưu ý rằng vòng lặp bằng văn bản theo cách này sẽ không bao giờ xem xét yếu tố cuối cùng trong mảng ban đầu của bạn. Điều đó có thể được cố định, mặc dù với logic hiện tại của bạn, nó dường như không quan trọng vì không có các yếu tố "nhiều hơn" để so sánh với yếu tố cuối cùng.

1

tôi đã tìm thấy các giải pháp với độ phức tạp O(n) và không yêu cầu tìm kiếm thông qua các mảng trở lại và chuyển tiếp:

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

// initiate the iterator for "next_val": 
$nextIterator = new ArrayIterator($a); 
$nextIterator->rewind(); 
$nextIterator->next(); // put the initial pointer to 2nd position 

// initiaite another iterator for "next_next_val":  
$nextNextIterator = new ArrayIterator($a); 
$nextNextIterator->rewind(); 
$nextNextIterator->next(); 
$nextNextIterator->next(); // put the initial pointer to 3rd position 

foreach($a AS $k => $v){ 

    $next_val = $nextIterator->current(); 
    $next_next_val = $nextNextIterator->current(); 

    echo "Current: $v; next: $next_val; next_next: $next_next_val" . PHP_EOL; 

    $nextIterator->next(); 
    $nextNextIterator->next(); 
} 

Chỉ cần nhớ để kiểm tra valid() nếu bạn có kế hoạch để chuyển tiếp trên $next_val$next_next_val.

0

Bạn không thể chỉ đơn giản là "tiếp tục đặt" trong vòng lặp. Tôi nghi ngờ bạn đang tìm cách để làm một cái gì đó dễ dàng hơn nhiều so với viết các biến lặp tùy chỉnh. Nếu bạn chỉ đơn giản là bỏ qua các mục có khóa trùng lặp, sau đó theo dõi khóa cuối cùng và so sánh nó với khóa hiện tại.

$a = array('leg1'=>'LA', 'leg2'=>'NY', 'leg3'=>'NY', 'leg4'=>'FL'); 

// Prints LA NY FL 
$last_v = null; 
foreach ($a as $k => $v){ 
    if ($last_v == $v) { 
     /** 
     * Duplicate value, so skip it 
     */ 
     continue; 
    } 
    echo $v.' '; 
    $last_v = $v; 
} 
Các vấn đề liên quan