2017-06-16 11 views
0

私はアイテムのグループを持っています(例:カウント[3,2,0,4,1,0,1,1,1,0,5,2,3])。ページ(最後のページを除く)。 array_sliceは現在counts配列を入力として使用していますが、最終的には対応するデータを入力として使用しています。最終版では、現在表示されているページに対してarray_sliceを1回だけ使用します。コードは、特別なPHPの関数を使用して、よりエレガント例えばを作ることができる場合、私は思っていたなどPHPをよりエレガントにページに分割するPHP?

出力:ページあたり

アイテム:1つのNUMページ:10

3。 2; 0,4; 1; 0,1; 1; 1; 0,5; 2; 3;

個数:2 numページ:8

3; 2; 0,4; 1,0,1; 1,1; 0,5; 2; 3;

ページあたりのアイテム数:3 num pages:5

3; 2,0,4; 1,0,1,1; 1,0,5; 2,3;ページあたり

アイテム:4つのNUMページ:5

3,2; 0,4; 1,0,1,1,1; 0,5; 2,3;ページあたり

アイテム:5つのNUMページ:4

3,2; 0,4,1; 0,1,1,1,0,5; 2,3;

ページあたりの項目数:6 num pages:3

3,2,0,4; 1,0,1,1,1,0,5; 2,3;

<?php 
    $group_counts = [3,2,0,4,1,0,1,1,1,0,5,2,3]; 
    splitOntoPages($group_counts, 1); 
    splitOntoPages($group_counts, 2); 
    splitOntoPages($group_counts, 3); 
    splitOntoPages($group_counts, 4); 
    splitOntoPages($group_counts, 5); 
    splitOntoPages($group_counts, 6); 

function splitOntoPages($item_group_counts, $items_per_page) { 
    $page_cumul_totals = [0 => 0]; 
    $page_first_index = [0 => 0]; 
    $page = 0; 

    foreach ($item_group_counts as $group_index => $group_total) { 
     $page_cumul_totals[$page] += $group_total; 
     if ($page_cumul_totals[$page] >= $items_per_page) { 
      $page++; 
      $page_first_index[$page] = $group_index + 1; 
      $page_cumul_totals[$page] = 0; 
     } 
    } 
    $page_first_index[$page + 1] = $group_index + 1; 

    $numPages = count($page_cumul_totals); 
    if ($page_cumul_totals[$numPages - 1] == 0) { 
     $numPages--; 
    } 
    echo 'Items per page: '.$items_per_page.' num pages: '.$numPages.'<br>'; 
    for ($p = 0; $p < $numPages; $p++) { 
     $fromIndex = $page_first_index[$p]; 
     $countOnPage = $page_first_index[$p + 1] - $fromIndex; 
     $page_items = array_slice($item_group_counts, $fromIndex, $countOnPage); 
     echo implode(',', $page_items).'; '; 
    } 
    echo '<br><br>'; 
} 

私の目標は、特定のページ番号に基づいてarray_sliceの正しいパラメータを決定するために...ともページ数を決定することです。

$ page_items = array_slice($ item_groups、$ fromIndex、$ countOnPage);

+0

あなたコードはうまくいきますし、コードを改善することができますか、実際にコード内に何か問題がありますか? – Xatenev

+0

エコーから離れて私にはうまく見えます。 'splitOntoPages'内で単一のループを使ってページの2D行列を返し、関数外の別のループでそれらを表示して、ページングロジックを表現から分離します。 –

+0

Xatenev:最近、私はarray_map、array_walkなどのようなものを使っています。コードをよりエレガントにして、ここで使用できる他のものがあるかどうか疑問に思っていました。 –

答えて

0

I最終的に私が探していたものを思いついた:それは、おそらく少し効率の低いものの、より簡潔かつ明確である...

function splitOntoPages($item_group_counts, $min_count_per_page) { 
    $total_groups = count($item_group_counts); 
    $page = 0;  
    $i = 0; 
    $page_details = []; 
    while ($i < $total_groups) { 
     for ($n = 1; $n < ($total_groups - $i); $n++) { 
      $page_total = array_sum(array_slice($item_group_counts, $i, $n)); 
      if ($page_total >= $min_count_per_page) { 
       $page_details[$page] = ['offset' => $i, 'length' => $n]; 
       $page++; 
       $i += $n; 
       continue 2; 
      } 
     } 
     $page_details[$page] = ['offset' => $i, 'length' => $n]; 
     break; 
    }  
    echo "Items per page: $min_count_per_page num pages: ".($page+1)."<br>"; 
    foreach ($page_details as $page => $details) { 
     echo implode(',', array_slice($item_group_counts, $details['offset'], $details['length'])).'; '; 
    }  
    echo '<br><br>'; 
} 

ページx上のアイテムを取得:

array_slice($item_group_info, $page_details[$page_index]['offset'], $page_details[$page_index]['length']));  
関連する問題