【问题标题】:Given a PHP associative array and a "current" key, calculate the "next" and "previous" elements (with looping)给定一个 PHP 关联数组和一个“当前”键,计算“下一个”和“上一个”元素(使用循环)
【发布时间】:2015-07-01 18:45:47
【问题描述】:

我意识到关于 SO 有许多类似的问题,但我似乎无法找到适合我的应用程序的答案。我正在做一些页面导航,并有以下 PHP 数组,其中键是页面标识符,值是 URL slug:

$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,即使“当前”键可能是数组的第一个或最后一个元素,我如何才能同时获得“下一个”和“上一个”键?

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

【问题讨论】:

  • array_keys() 在这里应该是一个有用的功能......允许您以数字方式识别位置,因此您可以检查 -1 和 +1 位置的键
  • @obertwbradford 你对第一个元素有什么期望?

标签: php arrays navigation


【解决方案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

【讨论】:

  • 索引 = 2;计数 = 3; nextIndex = (index + 1) % 计数; nextIndex 为 0,索引为 0 的元素,您的代码作为圆形工作
  • *假设我的“当前”页面是“a”。我想让 $next_page 设置为 'b' 而 $previous_page 设置为 'd'。 * - 提问者想要圈子,我明白
  • 很好的技术来环绕 prev/next
【解决方案2】:

使用数字键可能更容易,但您可以通过移动指针来进行操作。只需检查false 并致电end()

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

如果next() 在您的示例中,d 在您的示例中,您将遇到与next() 相同的问题。所以只需检查false 并致电reset()

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

逻辑可能会缩短一点。

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 1970-01-01
    • 2012-01-05
    • 2013-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多