2010-07-15 2 views
2

배열 (simpleXML 노드)을 통해 반복되는 foreach 루프가 있습니다. 이 배열은 0에서 수백 개의 항목을 가질 수 있습니다. 처음 10 개의 결과를 표시하고 다음 10 개를 표시하는 링크가있는 방법을 찾고 싶습니다.PHP - 다음 'X'항목을 표시 할 링크가있는 foreach 루프의 'X'항목 표시

$i=0; 
$limit=10; 
foreach ($nodes as $node){ 
echo "here is the output: ".$node."<br>\n"; 
if (++$i >=$limit) break; 
} 

분명히 상관없이 $ 노드 배열에 얼마나 많은 항목은 첫 번째 (10) 표시하지 않습니다하지만 난 foreach는 루프 카운터를 다시 읽었 생각한다 : 예를 들어

, 내가 현재 가지고 그들이 실행될 때마다 - 그래서 내가 말한 링크를 원한다면 : next 10 itmes - 나는 인덱스 = 10에서 시작하는 루프를 어떻게 말할 것인지 모르겠습니다.

내가 여기 오른쪽 나무를 짖고 있습니까?

+0

foreach 대신 명시 적 색인을 사용하여 for 루프를 사용하십시오. – knittl

답변

5

이것은 페이지 매김 호출에 대한 정기적를 사용해야합니다. 당신은 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"; 
} 

그런 다음 당신은 단지 인수와 같은 페이지를 가리키는 링크가 필요 페이지 = $ 페이지 + 1

+0

감사합니다. 나는 또한 아래의 Limititerator를 사용하여 @ ircmaxell의 솔루션을 시도했다. 이러한 솔루션 중 하나에 장단점이 있는지 궁금합니다. – dijon

1

당신은 루프

if(count($nodes) < 10) { 
    $nnodes = count($nodes); 
} else { 
    $nnodes = 10; 
} 

for($i = 0; $i < $nnodes; $i++) { 
    echo $nodes[$i]; 
} 
3

음, 당신이 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>'; 
} 
+0

고마워요. 완벽하게 작동했지만 위의 @Sebastian과 다른 접근법에 대해 궁금합니다. 이 특별한 경우에 Limititerator를 사용하면 이점이 있습니까? – dijon

+0

글쎄, 그것은 당신이하는 일에 달려 있습니다. array_slice는 데이터를 복사하므로 크기가 큰 경우 메모리 풋 프린트가 커질 수 있습니다. 그러나 LimitIterator는 여전히 건너 뛴 항목 (내부적으로)을 반복하므로 손실이 발생합니다. LimitIterator의 한 가지 장점은 배열이 아닌 모든 반복기에서 작동 할 수 있다는 점입니다. 그것은 아주 강력합니다. 예를 들어, 디렉토리 내의 파일의리스트를 매김하려면, DirectoryIterator를 작성해, LimitIterator에 건네줍니다. 반복자는 사소한 개념이 아닙니다 (이것이 더 많은 사람들이 사용하지 않는 이유입니다).하지만 그들은 매우 강력합니다 ... – ircmaxell

+0

SPL에서 소개 한 다른 반복자에 대해서는 아직 완전히 익숙하지 않습니다. LimitIterator라는 것이 있다는 것을 나는 몰랐다. 따라서 +1. 두 변종에 대한 벤치 마크를 보는 것이 흥미로울 것입니다. –

0

같은 문제를 사용할 수 있습니다,이 방법으로 해결

<?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; ?> 
0
if ($n++ <= 9) { 
echo 'what ever you like to get going'; 
} 
관련 문제