PHP的XML分页

时间:2013-03-29 17:49:47

标签: php xml parsing pagination simplexml

下面是我用于解析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>";
}

3 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

<?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>");
        } ?>

答案 1 :(得分: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

答案 2 :(得分:1)

由于SimpleXMLElementTraversable,您可以使用随PHP附带的LimitItertor进行分页。

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

分页的工作方式类似于其他数百个问题,我最好使用LimitPagination type

它将当前页面,每页元素和元素的总量作为参数(请参阅:PHP 5.2 and 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