- 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; } }