У меня есть массив $ data, и я хочу напечатать его с foreach ($ data как $ detail). Дело в том, что я хочу, чтобы внутри foreach печатал предыдущий и следующий элементы. Что-то вроде этого:
$data = array(1,2,3,4,5,6,7,8); // foreach result should look like this 8,1,2 1,2,3 2,3,4 3,4,5 4,5,6 5,6,7 6,7,8 7,8,1
Вы могли бы пойти:
$data = array (1,2,3,4,5,6,7,8); $count = count ($data); foreach ($data as $key => $current) { if (($key - 1) < 0) { $prev = $data[$count - 1]; } else { $prev = $data[$key - 1]; } if (($key + 1) > ($count - 1)) { $next = $data[0]; } else { $next = $data[$key + 1]; } echo $prev . ', ' . $current . ', ' . $next . "\n";
Или если краткость является проблемой:
$count = count ($data); foreach ($data as $i => $current) { $prev = $data[(($i - 1) < 0) ? ($count - 1) : ($i - 1)]; $next = $data[(($i + 1) > ($count - 1)) ? 0 : ($i + 1)]; echo $prev . ',' . $current . ',' . $next . "\n"; }
<?php $data = array(1,2,3,4,5,6,7,8); $count = count($data); foreach($data as $index => $number) { $previous = $data[($count+$index-1) % $count]; // '$count+...' avoids problems // with modulo on negative numbers in PHP $current = $number; $next = $data[($index+1) % $count]; echo $previous.", ".$current.", ".$next."\n"; }
О модуле по отрицательным числам: http://mindspill.net/computing/cross-platform-notes/php/php-modulo-operator-returns-negative-numbers.html
То же самое можно сделать по-другому:
<?php $data = range(1,16); $count=count($data); $ret=''; for($i=0;$i<$count;$i++){ $ret.=($i==0)?$data[$count-1].',':$data[$i-1].','; $ret.=$data[$i].','; $ret.=($i+1>=$count)?$data[$count-$i-1]:$data[$i+1].'<br>'; } echo $ret; ?> Result: 16,1,2 1,2,3 2,3,4 3,4,5 4,5,6 5,6,7 6,7,8 7,8,9 8,9,10 9,10,11 10,11,12 11,12,13 12,13,14 13,14,15 14,15,16 15,16,1