将foreach拆分为页面

时间:2013-06-21 05:11:19

标签: php xml

$files = glob('docs/*.xml');
 foreach($files as $file){
 $xml = new SimpleXMLElement($file, 0, true);
 echo'
 <tr>
 <td>' . $xml->doctype . '</td>
 <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td>
 <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td>
 <td>'. $xml->date .'</td>
 <td>* * * * *</td>
 <td></td>
 </tr>
 ';
}

上面的代码是一个循环,显示docs文件夹中的所有文件。 我希望在1页中只有10个xml文件,并将每个页面分成10个文件。 我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您可以使用以下方法之一拆分$ files数组,这两种方法都需要设置一个$ page变量,该变量将是一个整数,显示您要查看的10 xml文件页面。

// this will make files an array for 10 element 
$files = glob('docs/*.xml');
$files = array_chunk($files, 10);
foreach($files[$page-1] as $file){ 
$xml = new SimpleXMLElement($file, 0, true);
echo'
    <tr>
    <td>' . $xml->doctype . '</td>
    <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td>
    <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td>
    <td>'. $xml->date .'</td>
    <td>* * * * *</td>
    <td></td>
    </tr>
    ';
}

或者你可以使用数组切片来获得你想要的10个

$files = glob('docs/*.xml');
$files = array_slice($files, ($page-1)*10, 10);
foreach ($files as $file){
$xml = new SimpleXMLElement($file, 0, true);
echo'
    <tr>
    <td>' . $xml->doctype . '</td>
    <td><a href="viewdoc.php?docname=' . basename($file, '.xml') . '&username='. $xml->startedby .'&myname='. $_SESSION['username'] .'">' . basename($file, '.xml') . '</a></td>
    <td><a href="viewprofile.php?name='. $xml->startedby .'">'. $xml->startedby .'</a></td>
    <td>'. $xml->date .'</td>
    <td>* * * * *</td>
    <td></td>
    </tr>
    ';
}

答案 1 :(得分:1)

你应该更多地使用PHP中的迭代器来划分工作:

//Pages
$perPage = 10; // Avoid magic numbers

$files      = new GlobIterator('docs/*.xml');
$filtered   = new FileXmlDoctypeFilterIterator($files, $requestedType);
$count      = iterator_count($filtered);
$pagination = new LimitPagination($_GET['page'], $count, $perPage);

foreach ($pagination->getLimitIterator($filtered) as $file)
{
    $xml = simplexml_load_file($file);
    ...
}

那么这是如何工作的?首先,使用预定义的GlobIterator,根据它的名称,您可能已经看到了它的作用。但不是像glob()那样返回一个数组,而是一个迭代器。

这里特别做到允许在这里与其他迭代器堆叠。例如,下一个是具体的FilterIterator,因此您需要将当前用于过滤器决策的代码移动到此迭代器中。它在PHP手册中有详细说明。

然后使用iterator_count()函数获取所有过滤文件的计数,然后将LimitPagination对象与$pagination->getLimitIterator($filtered)对象一起使用,该对象将分页完全封装到它自己的对象中。有关详情,请参阅我的answer to XML pagination with PHP

它通过$_GET['page']提供另一个迭代器,以便它将提供指定页面内的过滤文件(上例中的SimpleXMLElement)。它还提供了一个页面列表,以便您可以将链接输出到其他页面。

所以这里做了什么:

  1. 过滤文件的问题已封装到过滤器迭代器中。
  2. 你的分页问题已被封装到一个分页对象中,它也提供了一个迭代器。
  3. 通过将数组转换为迭代器,解决了过滤全局文件的问题。
  4. 从技术上讲,你可以用数组来解决所有这些,但是迭代器的最大好处是它们比数组更灵活。

    例如,您可以通过创建一个迭代器来进一步改进这一点,该迭代器将创建一个LimitPagination的特殊子节点,该子节点还带有算法以获取知道文件路径的doctype 。给这个独特的接口将有助于filter-iterator。

    另外,当涉及分页时,缓存过滤器迭代器是有意义的,这样计数操作的权重就不会太大。

    迭代器的优点显然是代码重用,例如ArrayPagination对象适用于任何类型的分页,您可以以迭代器的形式为数据分页提供数据。

    如果你想坚持使用数组,你需要把它变成一个ArrayIterator对象而不是过滤器 - 迭代器,你可以使用array_filter()和一个过滤你的文件的回调函数。如果你使用数组进行原型设计,那么还有CallbackFilterIterator,所以你可以在数组之间切换到迭代器(还有{{1}},这也应该允许你重用数组过滤器功能)