2

下面是我用来解析 XML 文件的代码,但是文件有很多记录,我想对它进行分页,每页显示 20 条记录。

我还想要页面底部的分页链接,以便用户也可以转到其他页面。它应该是这样的,如果没有给出值,那么它将从 0 开始到 20,否则如果值为 2,则从 40 开始并在 60 处停止test.php?page=2

$xml = new SimpleXMLElement('xmlfile.xml', 0, true);

foreach ($xml->product as $key => $value) {
    echo "<a href=\"http://www.example.org/test/test1.php?sku={$value->sku}\">$value->name</a>";
    echo "<br>";
}
4

3 回答 3

3

像这样的东西应该工作:

<?php
    $startPage = $_GET['page'];
    $perPage = 10;
    $currentRecord = 0;
    $xml = new SimpleXMLElement('xmlfile.xml', 0, true);

      foreach($xml->product as $key => $value)
        {
         $currentRecord += 1;
         if($currentRecord > ($startPage * $perPage) && $currentRecord < ($startPage * $perPage + $perPage)){

        echo "<a href=\"http://www.example.org/test/test1.php?sku={$value->sku}\">$value->name</a>";    

        //echo $value->name;

        echo "<br>";

        }
        }
//and the pagination:
        for ($i = 1; $i <= ($currentRecord / $perPage); $i++) {
           echo("<a href='thispage.php?page=".$i."'>".$i."</a>");
        } ?>
于 2013-03-29T17:52:38.100 回答
1

您可以使用 php 的array_slice函数(文档:http ://www.php.net/manual/en/function.array-slice.php )

开始是$page * $itemsPerPage,结束是$page * $itemsPerPage + $itemsPerPage,页数是ceil(count($xml->product) / $itemsPerPage)

例子:

$allItems = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20);
$itemsPerPage = 5;
$page = isset($_GET['page']) ? intval($_GET['page']) : 0;

foreach (array_slice($allItems, $page * $itemsPerPage, $page * $itemsPerPage + $itemsPerPage) as $item) {
    echo "item $item";
}

它甚至可以工作:) 请参阅:http ://codepad.org/JiOiWcD1

于 2013-03-29T17:59:23.147 回答
1

作为SimpleXMLElementa Traversable,您可以LimitItertor使用 PHP 附带的 a 进行分页。

要获取产品元素的总数,您可以使用该SimpleXMLElement::count()函数。

分页的工作方式与其他数百个问题中概述的一样,我更喜欢使用它的LimitPagination类型

它以当前页面、元素总数和每页元素作为参数(另请参阅:PHP 5.2 和 Pagination)。它还有一个辅助函数来提供LimitIterator.

例子:

$products = $xml->product;

// pagination
$pagination = new LimitPagination($_GET['page'], $products->count(), 20);

foreach ($pagination->getLimitIterator($products) as $product) {
    ...
}

如果您想输出一个允许在页面之间导航的寻呼机,则可以LimitPagination提供更多功能以使其更容易,例如仅突出显示当前页面的所有页面(此处为括号示例):

foreach ($pagination->getPageRange() as $page)
{
    if ($page === $pagination->getPage()) {
        // current page
        printf("[p%d] ", $page); 
    } else {
        printf("p%d ", $page);
    }
}

foreach ($pagination->getPageRange() as $page)
{
    if ($page === $pagination->getPage()) {
        // current page
        printf("[p%d] ", $page); 
    } else {
        printf("p%d ", $page);
    }
}

交互式在线演示:http
://codepad.viper-7.com/OjvNcO 较少的交互式在线演示:http ://eval.in/14176

于 2013-04-01T10:09:08.473 回答