循环显示数组的下一个和上一个键

Posted

技术标签:

【中文标题】循环显示数组的下一个和上一个键【英文标题】:Show next and previous keys of an array with cycling 【发布时间】:2014-01-23 02:19:15 【问题描述】:

我相信你会喜欢的;)。

我需要一个功能来构建导航以浏览书中的页面(其中一些页面可能已经分开,它应该来回循环);它应该将链接(作为数字)输出到给定页面的“下一个”和“上一个”页面。

将接收数组和输入键的函数应该吐出数组的给定键的值以及“下一个”和“上一个”值的值。 但是,如果给定的键是数组中的第一个键,它应该将数组的最后一个键输出为“前一个”。同样,如果它接收到最后一个键,它应该将第一个键输出为“next”。

这是我目前所拥有的:

$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);

这应该确实有效(但没有“循环警告”)-您可以在 http://writecodeonline.com/php/ 中快速检查-如果描述使您感到困惑,此代码的输出是不言自明的... 我相信这很容易,但我没有想法,现在是凌晨 3 点。当然,我需要最简单的解决方案,所以可能有比我选择的更简单的方法。

【问题讨论】:

“骑自行车”是什么意思?关于输出 - 6 在 5 之后和 1 在 5 之前如何?那么order into array是什么意思呢? 数组可以不排序传递,但是用 php sort() 解决了,所以不用担心。循环意味着链接“下一个”和“上一个”应该循环工作,如下所示(来自此排序数组中的示例): 1, 5 , 6 , 8 , [1 , 5 ,6, 8 ], 1 , 5 , 6 ,依此类推(因此,如果您在 8 上,则 next 为 1,如果您在 1 上,则为 8)。我相信它在力学中被称为“环形计数器”。 但是我自己还是不清楚,这样做的目的是什么?以及这与带有报废页面的书籍有何联系?如果第 3 和第 4 页被废弃,那么我要从 2 直接到 5?如果你给我一个真实的例子或一个简单的场景,它会容易得多。 对不起,我认为这本书的例子会更好(更快)说明我的需要。现实生活中的例子是这样的:我有定制的 CMS。它显示类别,然后显示给定类别的产品。如果您转到特定产品页面,您应该可以导航该类别中的下一个和上一个产品。初始产品的编号可以从 1 到 10,但如果管理员删除了产品,则会在编号上留下空白(从而撕开书中的页面)。此外,导航应该轮流工作(作为“环形计数器”),就像我上面写的那样。这会让事情变得更清楚吗? 【参考方案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);

【讨论】:

谢谢 - 很好很简单,加上“下一个”和“上一个”现在可以循环遍历所有数组 :)。这就是 T 需要的。它显示了我是多么无助的开发人员(有时,至少;)。我仍然有点惊讶,这种机制在这里和网络上的其他问题中是如此罕见,以至于不能直接从盒子里理解,而且对某些人来说似乎很尴尬......【参考方案2】:

说实话真的很简单。

$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;

【讨论】:

感谢您的回答。但是,我认为,此功能不会循环。也许我解释得不够充分。链接“下一个”和“上一个”应该循环工作,就像这个排序数组中的示例一样: 1, 5 , 6 , 8 , [1 , 5 ,6, 8 ], 1 , 5 , 6 等等(我会在我的问题中强调这部分)【参考方案3】:

试试这个功能

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);

【讨论】:

感谢您的回答。但是,我认为,此功能不会循环。也许我解释得不够充分。链接“下一个”和“上一个”应该循环工作,就像这个排序数组中的示例一样: 1, 5 , 6 , 8 , [1 , 5 ,6, 8 ], 1 , 5 , 6 等等(我会在我的问题中强调这部分)

以上是关于循环显示数组的下一个和上一个键的主要内容,如果未能解决你的问题,请参考以下文章

无法显示图像无序列表中的下一个和上一个所有图像

显示链接到当前页面的下一个和上一个兄弟,和一个链接到pa页面

滚动库中的下一个和上一个按钮中的错误

下一个和上一个按键 Jquery

使用下一个和上一个图像箭头进行导航的 JS/jQuery 数组循环缩略图

使用codeigniter中的下一个和上一个按钮进行分页