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

Given a PHP associative array and a "current" key, calculate the "next" and "previous" elements (with looping)

我知道 SO 上有很多类似的问题,但我似乎找不到适合我的应用程序的答案。我正在做一些页面导航并有以下 PHP 数组,其中键是页面标识符,值是 URL slugs:

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

假设我的 "current" 页面是 'a'。我想将 $next_page 设置为 'b' 并将 $previous_page 设置为 'd'。当然,由于 "current" 页面是 '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" 和 "previous" 键,即使 "current" 键可能是第一个或数组的最后一个元素?

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

$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

使用数字键可能更容易,但这是您移动指针的方式。只需检查 false 并调用 end():

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

如果 next() 位于末尾,您将遇到与 next() 相同的问题,在您的示例中为 d。所以只需检查 false 并调用 reset().

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

逻辑可能会缩短一点。