给定一个PHP关联数组和一个" current"键,计算" next"和"之前"元素(带循环)

时间:2015-07-01 18:45:47

标签: php arrays navigation

我意识到在SO上有几十个类似的问题,但我似乎无法找到适合我的应用程序的答案。我正在进行一些页面导航并拥有以下PHP数组,其中键是页面标识符,值是URL slugs:

$pages = array(
  'a' => '/pages/first',
  'b' => '/pages/another',
  'c' => '/pages/third',
  'd' => '/pages/something-else'
);

说出我的"当前"页面是'a'。我希望$next_page设置为'b' $previous_page设置为'd' 。当然,因为"当前"页面为'a'我可以执行此操作以获取$next_page

while(key($pages) !== null && key($pages) !== 'a') next($pages);
$next_page = next($pages);

但是,由于'a'是数组的第一个元素,因此以下内容将$previous_page设置为false

while(key($pages) !== null && key($pages) !== 'a') next($pages);
$previous_page = prev($pages);

所以给定一个关联数组,例如上面的$pages,我怎样才能得到" next"和"之前"键即使当前"当前" key可以是数组的第一个或最后一个元素吗?

注意:$pages必须是带有任意字符串键的关联数组。

2 个答案:

答案 0 :(得分:1)

$key = 'a';

$keys = array_keys($pages);
$cur = array_search($key, $keys);
$next = $keys[($cur + 1) % count($keys)];
$prev = $keys[($cur - 1 + count($keys)) % count($keys)];

echo $pages[$prev] ."\n";
echo $pages[$next] ."\n";

结果

/pages/something-else
/pages/another

答案 1 :(得分:0)

使用数字键可能更容易,但通过移动指针可以实现这一点。只需检查false并致电end()

while(key($pages) !== 'a' && next($pages));
if(($previous_page = prev($pages)) === false) { $previous_page = end($pages); }

如果next()位于最后,d,您的问题就会出现同样的问题。因此,只需检查false并致电reset()

while(key($pages) !== 'd' && next($pages));
if(($next_page = next($pages)) === false) { $next_page = reset($pages); }

逻辑可能会缩短一点。