【问题标题】:Split foreach to pages将 foreach 拆分为页面
【发布时间】:2013-06-21 05:11:18
【问题描述】:
$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 文件夹中的所有文件。 我希望一页中只有 10 个 xml 文件,并将每一页拆分为 10 个文件。 我该怎么做?

【问题讨论】:

标签: php xml


【解决方案1】:

您可以使用以下方法之一拆分 $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>
    ';
}

【讨论】:

  • 您必须提供一个 $page 变量来显示您想要的 10 个元素夹头... $page 1 = xml 文件 1-10, $page 10 = xml 文件 91-100
  • 我们可以在聊天室继续提问吗? chat.stackoverflow.com/rooms/32192/private
  • 对垃圾邮件感到抱歉,但您没有回复我,请在聊天室帮助我。
【解决方案2】:

你应该更多地使用 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 对象一起使用。有关更多信息,请参阅我的answer to XML pagination with PHP

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

那么这里做了什么:

  1. 您的过滤文件问题已被封装到过滤器迭代器中。
  2. 您的分页问题已被封装到一个分页对象中,该对象也提供了一个迭代器。
  3. 您的过滤 globbed 文件的问题已通过将数组转换为迭代器来解决。

从技术上讲,您也可以使用数组来解决所有这些问题,但是这里使用迭代器的最大好处是它们比数组更灵活。

例如,您可以通过创建一个迭代器来进一步改进这一点,该迭代器将创建一个 SimpleXMLElement 的特殊子代,该子代还带有获取文档类型的算法,它知道文件路径。给它一个独特的接口将有助于过滤迭代器。

由于涉及到分页,缓存过滤迭代器是有意义的,这样计数操作的权重就不会太重。

这里迭代器的好处显然是代码重用,例如LimitPagination 对象只适用于任何类型的分页,您提供数据以迭代器的形式进行分页。

如果您想坚持使用数组,则需要将其转换为 ArrayPagination 对象,而不是过滤器迭代器,您可以使用带有过滤文件的回调函数的 array_filter()。如果您使用数组进行原型设计,还有ArrayIterator,因此您可以在两者之间从数组切换到迭代器(还有CallbackFilterIterator,它还应该允许您重新使用数组过滤器功能)。

【讨论】:

    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2023-02-02
    • 2013-01-19
    相关资源
    最近更新 更多