質問: "".$day["attendances"]."早退休暇出勤"; print("".$selectBox.""); } print(""); } print("".$button.""); print(''); print(""); print(""); ?> ``` ・ブラウザでの実行 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/3d3a203cae68ea246242eba361cbf8c3.png) ↓ 最終的に以下の状態を望んでます。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2310769d2aa2742d7a7f7f5b1062273c.png) ○質問 レコードを上記の画像のように区切ることがうまく行きません。 アルゴリズム的な問題かも知れませんが、やり方の問題もあるかと考えています。 どうすればうまく区切れるのか、、わかる方ご教授お願いします。
回答: 回答を書いてるうちに解決されてましたが、せっかくなので載せます(笑 //-- ここが問題 --// の部分の勤怠状況参照のループ処理で全てのデータを処理してしまっているのが原因かと思われます。 端折って書くと以下のようになりますが ``` //ユーザー名参照 while() { // ←ループ1 //勤怠状況参照 while() { // ←ループ2 // 横一列にならぶ問題の箇所 } } ``` [ループ2]にて9回ループしているようです。(つまり3人×3日分のデータ) ここで、一人分の処理が終わったら[ループ2]を抜けてしまえば上手くいきそうです。 ただし、 ``` $day = mysql_fetch_assoc($attendances) ``` DBから1行ずつ取得しているので、今のままのコードでは見づらかったり分かりづらかったりします。 ですので、多少処理に無駄があっても分かりやすいコードにしてみた方がいいと思います。 ``` /* DBからデータを取得する準備 */ // [ユーザー情報参照]と[PHP側で入力し指定した日付参照]は省略 // 各ユーザーの勤怠状況参照 // $attendances = mysql_query('select attendances from attendances_info'); // ↓ 全項目取得に修正 $attendances = mysql_query('select * from attendances_info'); /* データを取得し配列に格納する処理を行う */ // ユーザー名参照 $users = array(); while ($row = mysql_fetch_assoc($query)) { // ←ループ1 $users[] = $row; // ←データを用意する } // 勤怠状況参照 $attendanceDatas= array(); while ($day = mysql_fetch_assoc($attendances)) { // ←ループ2 $attendanceDatas[] = $day; // ←データを用意する } /* 用意された配列データを用いて表示を行う */ foreach ($users as $user) { foreach ($attendanceDatas as $data) { // ここでの$dataは質問者さんの$dayに相当 if ($user['user_name'] == $data['user_name']) { // 表示を行う、または表示するものを準備する } } } ``` 大体このようになるかと思います(一部抜粋なのでちゃんと動くように補完してください) (DBのデータを配列に入れなおす処理、実は一発で全て取得する関数があるのでループを回す必要がなかったりしますが、分かりづらいと思うのでとりあえず今回は上記のような形と致しました)