返回数组中特定位置的最后一个值

时间:2014-04-12 16:41:10

标签: php arrays

有一系列页面,

$pages = array(
   1,
   2,
   3,
   ...

   100,
   101
);

还有一个变量$current_page。我所要做的就是以类似digg的方式进行分页,这样看起来就像这样,

< 4 5 6 7 .... 15 16 17 18 >

首先想到的是从特定位置获取等于$current_page的最后一个和前一个数组值。

所以我开始使用基本的for循环,但问题是页面数量可能非常大,所以我认为这不是一件有效的事情。还有其他正确的方法吗? (可能通过原生的array_*函数)?

4 个答案:

答案 0 :(得分:2)

以下函数构建StackOverflow,就像分页一样。目标是:

  • 始终可以看到第一个和最后一个链接
  • 上一页和下一页链接必须始终可见
  • 当前页面之前/之后最多可显示4个链接

虽然以下功能显示完整的寻呼机,但我们主要感兴趣的是如何计算周围页面 a b 作为当前页面的函数< / strong>,寻呼机尺寸页数

function so_like_pager($current_page, $page_count, $pager_size = 4) {
    if ($current_page <= $pager_size) {
        // the pager for first 4 pages starts from 1
        $a = 1;
        $b = min(1 + $pager_size, $page_count);
    } else {
        // the pager for remaining pages ends at current page + 2
        // and starts so that 4 links are shown
        $b = min($current_page + ($pager_size >> 1), $page_count);
        $a = $b - $pager_size;
    }
    // return array("show_from" => $a, "show_upto" => $b);
    echo '<p>';
    if ($current_page !== 1) {
        echo '<a href="' . so_like_pager_page(1) . '">' . 1 . '</a> ';
    } else {
        echo '<b>' . 1 . '</b> ';
    }
    if ($a > 1 + 1) {
        echo '<span>...</span> ';
    }
    for ($i = $a; $i <= $b; $i++) {
        if ($i !== 1 && $i !== $page_count) {
            if ($current_page !== $i) {
                echo '<a href="' . so_like_pager_page($i) . '">' . $i . '</a> ';
            } else {
                echo '<b>' . $i . '</b> ';
            }
        }
    }
    if ($b < $page_count - 1) {
        echo '<span>...</span> ';
    }
    if ($current_page !== $page_count) {
        echo '<a href="' . so_like_pager_page($page_count) . '">' . $page_count . '</a> ';
    } else {
        echo '<b>' . $page_count . '</b> ';
    }
    echo '</p>';
}
function so_like_pager_page($page) {
    return 'page-' . $page . '/';
}

试验:

so_like_pager(1, 100);
so_like_pager(2, 100);
so_like_pager(3, 100);
so_like_pager(4, 100);
so_like_pager(5, 100);
so_like_pager(6, 100);
so_like_pager(50, 100);
so_like_pager(99, 100);
so_like_pager(100, 100);

输出:

Pagination code output

PS:注意:我很快将这个函数从ASP经典移植到PHP,并没有针对边缘情况进行测试。

答案 1 :(得分:1)

function get_surrounding_pages(array $pages, $current, $amount = 2) {
  $pages_idx = array_flip($pages);
  if (!isset($pages_idx[$current])) {
    return false;
  }
  $offset = max(0, $pages_idx[$current] - $amount);
  $limit = $amount + 1 + ($pages_idx[$current] - $offset);
  return array_slice($pages, $offset, $limit);
}    

$pages = range(1, 1000);
$current = 42;
get_surrounding_pages($pages, $current, 4); 
// array(38, 39, 40, 41, 42, 43, 44, 45, 46)

// this will work even if your number of pages is not continuous (eg: 1, 2, 6).
$pages = array(1, 2, 5, 6, 42, 234, 1048);
$current = 6;
get_surrounding_pages($pages, $current, 2); 
// array(2, 5, 6, 42, 234)

// also works if you reach the boundaries
$pages = range(1, 10);
$current = 2;
get_surrounding_pages($pages, $current, 2); 
// array(1, 2, 3, 4)
$current = 9;
get_surrounding_pages($pages, $current, 2); 
// array(7, 8, 9, 10)

// returns false if you ask a page that doesn't exists
$pages = range(1, 10);
$current = 42;
get_surrounding_pages($pages, $current, 2); 
// false

答案 2 :(得分:-1)

您可以使用PHP的end函数来获取数组的最后一个条目。

<?php

$a = array( 1, 2, 3, 4, 5, 10 );
echo end($a);

您还可以使用array_slicearray_splice剪切数组,或array_pop删除最后一个元素并返回删除的内容。

答案 3 :(得分:-1)

也许你可以试试end。应该比循环更有效。