質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

118閲覧

ブログのタイトルにつけた第〇回を10個ずつにまとめたい

sakanakuuuuunn

総合スコア14

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/08/28 08:18

前提・実現したいこと

ブログのタイトルにつけている「第〇回 ~~」を「第〇回の箇所を取得して、
第1回~第10回、第11回~第20回、第21回~・・・と、10件ずつまとめて下記のように表示したい。

▽第1回~第10回
・第10回
・第9回
・第8回

・第1回

発生している問題・エラーメッセージ

「▽第1回~第10回」の箇所を取得するため、minとmaxで最小値と最大値を取得しています。
また、10個ずつ取得したいと思ったため、余りが1になった場合、$iをインクリメントし、10件ずつまとめようとしておりますが、
順番通りに追加されず、
例えば、第20回の後に第21回じゃなく、第23回のブログを登録した場合、$iはインクリメントされず、同じ配列内に追加されてしまします。

該当のソースコード

PHP

1 2$i = 0; 3foreach($times_data as $key => $value){ 4 $array_times[$i]['times'][$key] = $value; 5 if($key % 10 === 1){ 6 //最小値 7 $array_times[$i]['min'] = min(array_keys($array_times[$i]['times'])); 8 //最大値 9 $array_times[$i]['max'] = max(array_keys($array_times[$i]['times'])); 10 $i ++; 11 } 12 13}
上記の$times_dataは下記の連想配列になっています。 Array ( [20] => Array ( [id] => 19 [times] => 20 ) [19] => Array ( [id] => 20 [times] => 19 ) [17] => Array ( [id] => 17 [times] => 17 ) [16] => Array ( [id] => 16 [times] => 16 ) [15] => Array ( [id] => 15 [times] => 15 ) [14] => Array ( [id] => 14 [times] => 14 ) [13] => Array ( [id] => 13 [times] => 13 ) [12] => Array ( [id] => 12 [times] => 12 ) [11] => Array ( [id] => 11 [times] => 11 ) [10] => Array ( [id] => 10 [times] => 10 ) [9] => Array ( [id] => 9 [times] => 9 ) [8] => Array ( [id] => 8 [times] => 8 ) [7] => Array ( [id] => 7 [times] => 7 ) [6] => Array ( [id] => 6 [times] => 6 ) [5] => Array ( [id] => 5 [times] => 5 ) [4] => Array ( [id] => 4 [times] => 4 ) [3] => Array ( [id] => 3 [times] => 3 ) [2] => Array ( [id] => 2 [times] => 2 ) [1] => Array ( [id] => 1 [times] => 1 ) )

やりたいこと

第1回~第10回、第11回~第20回、第21回~・・・と、10件ずつまとめて表示したいのですが、どのようにしたらよろしいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2018/08/28 12:23

各変数の説明を入れてください。あと、目標の状態がわからない。どの変数の中身がどのような状態になっていることを期待していますか?こうなっていてほしいという状態を質問文に追記してください。
guest

回答1

0

ベストアンサー

質問文を見た感じだと、
「10件ずつ」というよりは、「10回分(10件無くても)」ずつまとめたい、ということのように思いましたので、そのつもりで回答を。。。

■前提として、

ブログデータはtimesの昇順で取得しましょう。(後から並べたければ降順に)

■sampleのコードはこんな感じです。

php

1$array_times = array(); 2$last_time_idx = 0; 3$i = 0; 4foreach($times_data as $value){ 5 $now_time = $value['times'] ; 6 7 //★10で割った「商」の切り上げ数字 8 $time_idx= ceil($value['times'] / 10); 9 10 //一つ前のtime_idxと比較(※ただし、$last_time_idx =0は一つ前のデータがないときなので、処理しません) 11 if($last_time_idx > 0 && $last_time_idx != $time_idx){ 12 $i++; 13 } 14 //初期化処理はきちんと書きましょう 15 if(!isset($array_times[$i])){ 16 $array_times[$i] = array('times' => array()); 17 } 18 19 //最小値、最大値を正しく取得する為に、キーはtimesの値にします 20 $array_times[$i]['times'][$now_time] = $value; 21 //最小値 22 $array_times[$i]['min'] = min(array_keys($array_times[$i]['times'])); 23 //最大値 24 $array_times[$i]['max'] = max(array_keys($array_times[$i]['times'])); 25 26 //今の$time_idxが、次回「一つ前の$time_idx」になる 27 $last_time_idx = $time_idx; 28}

この中で、ポイントになるのは下記の部分です。

php

1 //★10で割った「商」の切り上げ数字 2 $time_idx= ceil($value['times'] / 10);

1~10 を10で割って、切り上げると、全て「1」に、
11~20を10で割って、切り上げると、全て「2」に、
21~30を10で割って、切り上げると、全て「3」に・・・

と、まとめたい10回分で、必ず同じ答えが返ってくるので、これを判定に使います。

1つ前のデータと、今のデータの$time_idxが、異なる場合のみ$iをインクリメントしていくことで、10回分ずつをまとめることが出来ます。
番号が飛び飛びだったとしても、その影響は受けません。


もし、本当にただ、「10件ずつ」まとめるだけなら、そんなに難しいことは不要です。

php

1$array_times = array(); 2$i = 0; 3foreach($times_data as $value){ 4 //10件分あつまったら、インクリメントするだけ・・ 5 if(isset($array_times[$i]) && count($array_times[$i]['times']) == 10){ 6 $i++; 7 } 8 9 //初期化処理はきちんと書きましょう 10 if(!isset($array_times[$i])){ 11 $array_times[$i] = array('times' => array()); 12 } 13 14 $_now_time = $value['times'] ; 15 16 //最小値、最大値を正しく取得する為に、キーはtimesの値にします 17 $array_times[$i]['times'][$_now_time] = $value; 18 //最小値 19 $array_times[$i]['min'] = min(array_keys($array_times[$i]['times'])); 20 //最大値 21 $array_times[$i]['max'] = max(array_keys($array_times[$i]['times'])); 22 23}

投稿2018/08/30 09:31

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakanakuuuuunn

2018/09/04 00:51

ご回答ありがとうございます!大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問