虽然循环在PHP没有完成循环

时间:2016-02-05 22:18:00

标签: php loops while-loop

我正在研究这段代码并试图让它只从存储库中提取4个条目,它会不断提取我的所有条目。

<?php
     while ( $i < 4) {
            foreach ($churchEvents->getResults() as $churchEvent){
                ?>  
                    <tbody>
                        <tr>
                            <td> <?php echo $churchEvent->getStructuredText('church-events.event-title')->asText(); ?>
                            </td>
                            <td class="cuntd" style="vertical-align: middle;">
                                <?php echo $churchEvent->getDate('church-events.event-start-date')->asDateTime()->format('l, F j, Y'); ?>
                            </td>
                        </tr>

                    </tbody> 

                <?php $i++; } } ?>

3 个答案:

答案 0 :(得分:0)

因为虽然是在foreach之外。

while ( $i < 4) {
        foreach ($churchEvents->getResults() as $churchEvent){

在foreach开始时尝试如果中断相结合。

//you don't need while here anymore
foreach ($churchEvents->getResults() as $churchEvent){
if ($i >= 4) {
    break;
}

答案 1 :(得分:0)

方法名称足够独特,可以猜出你正在使用的库/ api:(http://prismicio.github.io/php-kit/namespaces/Prismic.html),对吧?

->getResults() method返回一个数组。所以,有几种选择;以下是其中一些:

使用SPL LimitIterator

<?php
// only fetching the first four entires
$iter = new LimitIterator( new ArrayIterator($churchEvents->getResults()), 0, 4);
foreach ($iter as $churchEvent) { ?>  
    <tbody>
        <tr>
            <td> <?php echo $churchEvent->getStructuredText('church-events.event-title')->asText(); ?></td>
            <td class="cuntd" style="vertical-align: middle;"><?php echo $churchEvent->getDate('church-events.event-start-date')->asDateTime()->format('l, F j, Y'); ?></td>
        </tr>
    </tbody> 
<?php 
}

使用array_slice()获取前四个元素,然后迭代这四个元素:

<?php
// copying the first four element of the array
$arr = array_slice($churchEvents->getResults(), 0, 4);
foreach ($arr as $churchEvent) { ?>  
    <tbody>
        <tr>
            <td> <?php echo $churchEvent->getStructuredText('church-events.event-title')->asText(); ?></td>
            <td class="cuntd" style="vertical-align: middle;"><?php echo $churchEvent->getDate('church-events.event-start-date')->asDateTime()->format('l, F j, Y'); ?></td>
        </tr>
    </tbody> 
<?php 
}

(首选选项:)仅请求四项/ fragements:
我不熟悉api,但至少有方法pageSize(integer $pageSize) : \Prismic\SearchForm设置分页的结果集大小。也许你甚至可以用一些谓词或限制条款或某些东西限制响应中的结果数量,即只请求你真正需要的东西。

答案 2 :(得分:0)

你有两个循环,但没有理由有两个循环。内部的一个(foreach)已遍历所有 $ churchEvents ,因此外部的一个(while)不会让它做得更少。

删除外部while循环和$i++;,并使内循环仅循环前四个元素。

为此,您可以使用=>语句中的foreach语法获取 $ i 的值,然后添加if以退出循环:

<tbody>  
<?php
foreach ($churchEvents->getResults() as $i => $churchEvent){
    if ($i >= 4) break;
?>  
    <tr>
        <td> <?= $churchEvent->getStructuredText('church-events.event-title')->asText() ?>
        </td>
        <td class="cuntd" style="vertical-align: middle;">
            <?= $churchEvent->getDate('church-events.event-start-date')->asDateTime()->format('l, F j, Y') ?>
        </td>
    </tr>
<?php
}
?>
</tbody>

请注意tbody不应多次生成,因此它应该不在循环中。