2015-09-22 2 views
2

Мне не удается добавить навигационную стрелку в мое портфолио. Я хотел бы получить следующий и prev id на основе текущего id. Проблема в том, что $current_id является последним из массива, я не знаю, как перейти к первому, чтобы создать своего рода цикл. И то же самое, если $current_id является первым элементом, как иметь последний элемент как предыдущий? Я застрял, ты можешь мне помочь?PHP: получить следующий/предыдущий элемент массива с циклом, если последний/первый

Вот мой код:

<?php 

    $current_id = "10"; 

    $array = array(
     "1" => "aa", 
     "2" => "bb", 
     "3" => "cc", 
     "4" => "dd", 
     "5" => "ee", 
     "6" => "ff", 
     "7" => "gg", 
     "8" => "hh", 
     "9" => "ii", 
     "10" => "jj", 
    ); 


    $current_index = array_search($current_id, $array); 

    $next = $current_index + 1; 
    $prev = $current_index - 1; 

?> 
+0

уверен, что ключ для массива будет оставаться таким же Вы, как 1,2,3 ... –

+0

Разве это можно просто сделать $ массив [$ current_index + 1 ]? – Crecket

ответ

2

Вы можете использовать по модулю % для этого для следующего значения:

$number_of_elements = count($array); 
$next = ($current_index + 1) % $number_of_elements; 

И Условной для значения предыдущего, так как по модулю не любит отрицательные числа

$prev = $current_index - 1 
if ($prev < 0){ 
    $prev = $number_of_elements - 1; 
} 
+0

Я думаю, что код не будет запущен в случае prev –

+0

Вы правы, обновленный ответ. –

+0

Большое спасибо, он отлично работает, это именно то, что я ожидал. –

0

Вы можете использовать reset() и end() функции перемещения указателя массива в начало и конец массива. Таким образом, перед обработкой вашего массива вы могли бы сделать что-то вроде:

end($array); 
$end = key($array); 

, а затем:

reset ($array); 
while (current ($array)) { 
    $current_index = key($array); 
    $current_value = current($array); 
    if ($current_index == $end) 
     reset($array); 
    else 
     next($array); 
} 

Или построить какой-то связный список, где каждый элемент вашего массива будет иметь указатель/ссылку следующий элемент.

1

Использование по модулю таким образом:

$current_id = 9; 

$array = array(
    "aa", 
    "bb", 
    "cc", 
    "dd", 
    "ee", 
    "ff", 
    "gg", 
    "hh", 
    "ii", 
    "jj", 
); 

$next = ($current_id+($count=count($array))+1)%$count; 
$previous = ($current_id+$count-1)%$count; 

print("$previous $next"); 
+0

, который также действителен, хотя вычисление счета действительно неэффективно. –

+0

@BasvanStein: Это более элегантно, чем ваше решение, а разница в эффективности должна быть близка к 1/бесконечной. В любом случае, проверьте это сейчас, вы найдете его более эффективным. – Amarnasan

+0

@Armarnasan :), что лучше +1 –

0

Вы могли бы достичь, если у вас есть последний идентификатор страницы.

попробовать что-то, как

$last=count($array); 
$next = $current_index + 1; 
$next=$next<0?$last:$next; 
$prev = $current_index - 1; 
$prev =$prev==$last?1:$prev 
Смежные вопросы