2014-01-23 125 views
0

我相信你會喜歡它;)。顯示與循環陣列的下一個和前一個鍵

我需要一個建立瀏覽網頁頁面的導航功能(其中一些頁面可以分開收集,它應該來回循環);它應該將鏈接(如數字)輸出到給定頁面的「下一頁」和「上一頁」頁面。

將接收數組和輸入鍵的函數應該吐出數組給定鍵的值以及「next」和「previous」值的值。 但是,如果給定的鍵是數組中的第一個鍵,它應該將數組的最後一個鍵輸出爲「previous」。同樣,如果它接收到最後一個鍵,它應該輸出第一個鍵作爲「下一個」。

這是我到目前爲止有:

$pages = array(5, 1, 6, 8); 
sort($pages); 

$selected = 1; // that's second key (value:5, next:6, previous:1) 
// $selected = 3; // that's forth and a last key (value:8, should return next:1, previous:6) 

$selected = key($pages)+$selected; 

while ($pointer = current($pages)) { 

if ($selected == key($pages)) { 
     echo $pointer." - current <br>"; 
    } 
elseif($selected+1 == key($pages)){ 
    echo $pointer." - next <br>"; 
} 
elseif($selected-1 == key($pages)){ 
    echo $pointer." - previous <br>"; 
} 

else 
    echo $pointer."<br>"; 

    next($pages); 
} 

這應該實際工作(但沒有「週期awarness」) - 你可以在http://writecodeonline.com/php/快速檢查 - 如果說明迷惑你,這個代碼的輸出是相當自我解釋... 我相信這很容易,但我沒有想法,現在是凌晨3點。當然,我需要最簡單的解決方案,所以它可能比我選擇的更簡單一些。

+1

你是什麼意思與「循環」?關於輸出 - 5和1之後是5還是5之前?那麼到數組中的順序是什麼意思呢? – divaka

+0

數組可以通過未排序,但用PHP排序()解決,所以不用擔心。循環意味着鏈接「下一個」和「前一個」應該循環工作,像這樣(從這個排序數組中的示例):1,5,6,8,[1,5,6,8],1,5, 6,等等(所以如果你在8,下一個是1,如果你在1以前是8)。我相信它在力學中被稱爲「環形計數器」。 –

+0

但是我還不清楚,這是什麼目的?以及這是如何與報廢頁面的書籍連接?如果第3頁和第4頁報廢,那麼我會從2直到5?如果你給我一個真實的例子或一個簡單的場景,它會容易得多。 – divaka

回答

1

我覺得這是你的問題的解決方案。告訴我,如果它做你想要的(一些檢查,如果你走出去的數組邊界將是不錯:)但我們堅持簡單...):

/* This is from your code */ 
$pages = array(5, 1, 6, 8); 
sort($pages); 

$selected = 1; // that's second key (value:5, next:6, previous:1) 
$selected = 3; // that's forth and a last key (value:8, should return next:1, previous:6) 
/* ... */ 

$pages_count = count($pages); 
$pages_ordered = array(); 
$pages_ordered["current"] = $pages[$selected]; 


foreach($pages as $order_number => $page) 
{ 
    if($selected == 0) { 
     $pages_ordered["previous"] = $pages[$pages_count - 1]; 
     $pages_ordered["next"] = $pages[$selected + 1]; 
    } elseif($selected == ($pages_count - 1)) { 
     $pages_ordered["next"] = $pages[0]; 
     $pages_ordered["previous"] = $pages[$selected - 1]; 
    } else { 
     $pages_ordered["next"] = $pages[$selected + 1]; 
     $pages_ordered["previous"] = $pages[$selected - 1]; 
    } 
} 

print_r($pages_ordered); 
+0

謝謝 - 很好很簡單,再加上「next」和「previous」可以循環所有數組:)。這就是T所需要的。它顯示了我是多麼無助的開發人員(有時候,至少;)。儘管如此,我還是覺得這種機制在這裏和網絡上的其他問題上非常罕見,它不能直接從盒子中理解,而且對某些人來說似乎很尷尬...... –

1

說實話很簡單。

$pages = array(5, 1, 6, 8); 
sort($pages); 

//how many pages do we have 
$total = count($pages); 

//replace with $_GET['page']; when ready 
$requested_page = rand(0, ($total -1)); //$_GET['page']; 

//the selected page 
$selected = $pages[$requested_page]; 

//if this isn't the first page 
if($selected != $pages[0]): 

    //get the previous page 
    $prev = $requested_page-1; 

    //standard issue 
    echo '<a style="margin:0 15px;" href="myscript.php?page=', $pages[$prev] ,'"> Previous </a>'; 
endif; 


//iterate each page 
foreach($pages as $page): 

    //a ternary operator to assign a class if this is the current page we're on or not 
    $cls = ($page == $selected) ? 'active' : false; //for your current page class 

    //you don't need the style 
    echo '<a class="', $cls ,'" href="myfile.php?page=', $page ,'">', $page ,'</a>'; 
endforeach; 

//if this is not the last page 
if(selected != $pages[$total]): 

    //our next page 
    $next = $requested_page+1; 

    //standard issue 
    echo '<a href="myscript.php?page=', $pages[$next] ,'"> Next </a>'; 
endif; 
+0

謝謝你的回答。但是,我認爲,這個功能不會循環。也許我解釋不夠。鏈接「next」和「previous」應該循環工作,就像這個排序數組中的例子:1,5,6,8,[1,5,6,8],1,5,6等等(我會在我的問題中強調這一部分) –

0

試試這個功能

function get_nav($arr,$current){ 
    while($nav = current($arr)){ 
     if(key($arr)==$current){ 
     $prev =prev($arr); 
     empty($prev)?reset($arr):''; 
     next($arr); 
     $r = current($arr); 
     $next = next($arr); 
     prev($arr); 
     return array('prev'=>$prev,'current'=>$r,'next'=>$next); 
     } 
     next($arr); 
    } 

    return FALSE; 
} 

$pages = array(5, 1, 6, 8); 
sort($pages); 

$selected = 0; 
$res = get_nav($pages,$selected); 
+0

謝謝你的回答。但是,我認爲,這個功能不會循環。也許我解釋不夠。鏈接「next」和「previous」應該循環工作,就像這個排序數組中的例子:1,5,6,8,[1,5,6,8],1,5,6等等(我會在我的問題中強調這一部分) –