$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个文件。 我怎么能这样做?
答案 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
)。它还提供了一个页面列表,以便您可以将链接输出到其他页面。
所以这里做了什么:
从技术上讲,你可以用数组来解决所有这些,但是迭代器的最大好处是它们比数组更灵活。
例如,您可以通过创建一个迭代器来进一步改进这一点,该迭代器将创建一个LimitPagination
的特殊子节点,该子节点还带有算法以获取知道文件路径的doctype 和 。给这个独特的接口将有助于filter-iterator。
另外,当涉及分页时,缓存过滤器迭代器是有意义的,这样计数操作的权重就不会太大。
迭代器的优点显然是代码重用,例如ArrayPagination
对象适用于任何类型的分页,您可以以迭代器的形式为数据分页提供数据。
如果你想坚持使用数组,你需要把它变成一个ArrayIterator
对象而不是过滤器 - 迭代器,你可以使用array_filter()
和一个过滤你的文件的回调函数。如果你使用数组进行原型设计,那么还有CallbackFilterIterator
,所以你可以在数组之间切换到迭代器(还有{{1}},这也应该允许你重用数组过滤器功能)