Tôi đang tìm cách để có được cặp khóa/giá trị tiếp theo và 1 trong một foreach []. Ví dụ:
$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
}
}
LAJOS VERES
13,5K7 Huy hiệu vàng43 Huy hiệu bạc56 Huy hiệu Đồng7 gold badges43 silver badges56 bronze badges
Đã hỏi ngày 9 tháng 12 năm 2013 lúc 20:02Dec 9, 2013 at 20:02
2
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
}
}
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:06Dec 9, 2013 at 20:06
LAJOS VERESLAJOS VERESLajos Veres
13,5K7 Huy hiệu vàng43 Huy hiệu bạc56 Huy hiệu Đồng7 gold badges43 silver badges56 bronze badges
1
Đã hỏi ngày 9 tháng 12 năm 2013 lúc 20:02
$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[];
}
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ự:Dec 9, 2013 at 20:35
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:06Maciej Sz
LAJOS VERESLAJOS VERES7 gold badges40 silver badges54 bronze badges
Tôi đã tìm thấy giải pháp với độ phức tạp O[n]
và không yêu cầu tìm kiếm qua mảng trở lại và chuyển tiếp:
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
}
Chỉ cần nhớ kiểm tra valid[]
nếu bạn có kế hoạch chuyển tiếp trên $next_val
và $next_next_val
.
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:35
Maciej Szmaciej SZDec 9, 2013 at 20:12
10,2K7 Huy hiệu vàng40 Huy hiệu bạc54 Huy hiệu đồngjszobody
Đây là một cách để làm điều đó:6 gold badges59 silver badges70 bronze badges
Ví dụ: //3v4l.org/igcxw
Lưu ý rằng vòng lặp được viết theo cách này sẽ không bao giờ kiểm tra phần tử cuối cùng trong mảng ban đầu của bạn. Điều đó có thể được sửa chữa, mặc dù với logic hiện tại của bạn, dường như không quan trọng vì không có yếu tố "nhiều hơn" để so sánh phần cuối cùng.
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:12
$keys = array_keys[$array];
for [$i = 0; $i < count[$keys]; $i++] {
$cur = $array[$keys[$i]];
$next = $array[$keys[$i+1]];
}
JSZOBODYJSZOBODYDec 9, 2013 at 20:11
Phù bằng vàng 28k659 Huy hiệu bạc70 Huy hiệu đồngPeter
Hãy xem bộ nhớ đệm, như được mô tả trong câu trả lời này:1 gold badge23 silver badges32 bronze badges
Đi trước khi lặp một mảng trong PHP
$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;
}
Hoặc sử dụng Array_Keys [] nằm trong một câu trả lời khác được đăng cho cùng một câu hỏi, ví dụ:Dec 9, 2013 at 20:56
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:11Dave
Peterpeter1 gold badge15 silver badges9 bronze badges
2.4761 Huy hiệu vàng23 Huy hiệu bạc32 Huy hiệu đồng
Bạn không thể chỉ đơn giản là "ở lại" trong một 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 trình lặp tùy chỉnh. Nếu bạn chỉ muốn bỏ qua các mục với các khóa trùng lặp, thì hãy theo dõi khóa cuối cùng và so sánh nó với bản hiện tại.
Đã trả lời ngày 9 tháng 12 năm 2013 lúc 20:56Dec 9, 2013 at 20:09
ern0ern0ern0
Davedave25 silver badges35 bronze badges