PHP:ページネーション?, 関数、array_chunk, array_splice, rtrim

  • array_chunk($arr, 分割したい$length, bool)

$arr:対象配列、$length:分割したい長さ、bool:$arr のキーをそのまま維持したい場合

  • array_splice($arr, 開始位置, 削除したい$length)

  • rtrim($str, ' ');

$str:対象文字列の最後の空白を削除する。

/*
1. n / s = あまりが、最後のページ表示される結果数
2. 何ページ表示することになるのか?
3. 表示したいページ番号p が、$maxPages 以下であれば、none ではない。
4. $n % $s = 0 なら、 最後のページも他のページと同様の数、値が入っている。
5. 連想配列を作って、表示したいページp とその連想配列のキーが一致した配列を出力すればよい。
6. 余りを算出して、最後のページに何件値があるか、だす
*/

//検索結果の件数 n、ページサイズ s 、表示したいページ番号数 p 
    list($n , $s, $p) = explode(' ', trim(fgets(STDIN)));
    // 2.何ページ表示することになるのか
    function maxPages($n, $s)
    {
        $result = 0;
        if ($n % $s === 0) {
            $result = $n / $s;
            return $result;
        } else {
            $result = round($n / $s) + 1;
            return $result;
        }
    };
    $maxPages = maxPages($n, $s);
    
    // 表示したいページp が、ページネーションの最後のページ番号より大きかったら、
    // none を出力して、全ての処理を終わらす。
    if ($maxPages < $p) {
        echo "none";
        die();
    }
    
    $arr = [];
    $number = 0;
    // 連想配列を作成する
    for($i = 0; $i < $maxPages; $i++) {
        for($k = 0; $k < $s; $k++) {
            $number++;
            $arr[] = $number;
        }
    }
    // print_r($arr);
    // $s 単位に、区切って多次元配列化する
    $multiArr = array_chunk($arr, $s);
    // print_r($multiArr);
    
    // 6. 最後のページの余りの数。
    function lastValues($n, $s)
    {
        $result = $n % $s;
        return $result;
    }
    $lastValues = lastValues($n, $s);
    
    $lastArrValues = [];
    if($n % $s !== 0) {
        // $multiArrの最後のキーの配列の値を($s - $lastValues) 分 array_splice()を使って、削除する
        $lastArrValues = array_splice($multiArr[$maxPages - 1], -$lastValues);
    }

    $ans = '';
    foreach($multiArr as $key => $v) {
        if($key === $p - 1) {
            foreach($multiArr[$p - 1] as $v) {
                $ans .= $v . ' ';
            }
            echo rtrim($ans, ' ');
            break;
        }
    }