2014-10-19 29 views
-1

生成所述整個組合我有以下循環,結合兩個陣列,並顯示在有序列表中的結果:分頁組合而不預先

$list1 = array("make","break","buy"); 
$list2 = array("home","car","bike"); 

echo "<ol>"; 
for($a=0; $a<3; $a++){ 
    for($b=0; $b<3; $b++){ 
     echo "<li".($list1[$a].$list2[$b])."</li>"; 
    } 
} 
echo "</ol>"; 

實際陣列我有包括各約1500字,所以這個名單超過2百萬個組合。

有沒有辦法用分頁顯示結果,而無需事先生成整個結果集? 例如每頁500個項目?如果這會弄亂分頁,我不一定需要在有序列表中顯示結果。

+0

*「?是否有顯示與分頁結果的方式」 * - 你有沒有Google'd「PHP分頁」?我敢打賭,我可以在5秒內找到50個結果*平坦的*我不會這樣做,那是你的工作。 – 2014-10-19 02:34:29

+0

@ Fred-ii-我打賭他/她做了......我做了,並沒有發現與array_的_組合相關的任何相關內容。我發現這很有趣。 – matpop 2014-10-19 16:32:07

+0

@ Fred-ii-,你不想回答我的問題,然後評論。不要浪費每個人的時間用你無用的評論。 – user2171083 2014-10-19 17:45:21

回答

1

首先,你需要能夠開始從循環數組中的任何位置
當然,您可以使用for循環,但我認爲while循環在這裏更合適。

$length1 = count($list1); 
$length2 = count($list2); 

//now indexes are initialized to variable values 
$a = $var1; //start position $var1 is an integer variable between 0 and ($length1 - 1) 
$b = $var2; //start position $var2 is an integer variable between 0 and ($length2 - 1) 

while ($a < $length1) { 
    while ($b < $length2) { 
     echo '<li>', $list1[$a], ' ', $list2[$b], '</li>'; 
     $b++; 
    } 
    $b = 0; //reset inner loop each time it ends 
    $a++; 
} 

接下來,我們需要一種方法來停止循環,如果組合結束之前達到每頁($limit)結果的最大數量。

$length1 = count($list1); 
$length2 = count($list2); 
$a = $var1; 
$b = $var2; 

$counter = 0; 

while ($a < $length1) { 
    while ($b < $length2) { 
     echo '<li>', $list1[$a], ' ', $list2[$b], '</li>'; 

     $counter++; 
     if($counter === $limit) break 2; 

     $b++; 
    } 
    $b = 0; 
    $a++; 
} 

最後,我們必須找到正確的值$var1及以上$var2,根據當前$page$limit(從第1頁開始)上。這是明確的算術,我不會在這裏解釋。
全部放在一起:

$length1 = count($list1); 
$length2 = count($list2); 

$offset = $limit * ($page - 1); 
$a = (int)($offset/$length2); 
$b = $offset % $length2; 

$counter = 0; 
while ($a < $length1) { 
    while ($b < $length2) { 
     echo '<li>', $list1[$a], ' ', $list2[$b], '</li>'; 
     $counter++; 
     if($counter === $limit) break 2; 
     $b++; 
    } 
    $b = 0; 
    $a++; 
}