У меня есть цикл foreach, который проходит через массив (узлы simpleXML). Этот массив может иметь от 0 до нескольких сотен элементов. Я хотел бы найти способ отображать первые 10 результатов, а затем иметь ссылку для отображения следующих 10 и так далее.
например, в настоящее время я имею:
$i=0; $limit=10; foreach ($nodes as $node){ echo "here is the output: ".$node."<br>\n"; if (++$i >=$limit) break; }
очевидно, независимо от того, сколько элементов находится в массиве $ nodes, оно отображает только первые 10. Но я думаю, что я читал, что петли foreach перезапускают счетчик каждый раз, когда они запускаются, поэтому, если бы я хотел иметь ссылку, которая говорила: next 10 itmes
– Я не уверен, как бы я сказал, чтобы цикл начинался с index = 10.
Я даже лаяю верное дерево здесь?
Это называется разбиение на страницы. Вы можете извлечь сегмент массива, который вам нужен, с помощью array_slice: http://php.net/array_slice
<?php $page = isset($_GET['page']) ? intval($_GET['page']) : 0; $elementsPerPage = 10; $elements = array_slice($nodes, $page * $elementsPerPage, $elementsPerPage); foreach($elements as $node) { echo "Here is the output: ".$node."<br>\n"; }
Тогда вам нужна только ссылка, указывающая на одну страницу с аргументом? Page = $ page + 1
Ну, вы можете использовать LimitIterator …
$offset = (int) (isset($_GET['offset']) ? $_GET['offset'] : 0); $limit = 10; $arrayIterator = new ArrayIterator($nodes); $limitIterator = new LimitIterator($arrayIterator, $offset, $limit); $n = 0; foreach ($limitIterator as $node) { $n++; //Display $node; } if ($n == 10) { echo '<a href="?offset='.($offset + 10).'">Next</a>'; }
Вы должны использовать регулярный цикл
if(count($nodes) < 10) { $nnodes = count($nodes); } else { $nnodes = 10; } for($i = 0; $i < $nnodes; $i++) { echo $nodes[$i]; }
У меня была та же проблема, решена так
<?php $i=0 ?> <?php foreach ($nodes as $node) : ?> <?php $i++ ?> <?php echo "here is the output: ".$node."<br>\n"; ?> <?php if ($i == 3) break; ?> <?php endforeach; ?>
if ($n++ <= 9) { echo 'what ever you like to get going'; }