2014-01-23 51 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等等(我会在我的问题中强调这一部分) –