blue-chicken
@blue-chicken

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

取得した日報データの一部しか表示できない

Q&A

Closed

解決したいこと

MAMPのローカル環境下で、日報登録システムを作っています。
phpMyadminに登録済みの2022年7月1日〜31日の日報データを、一覧として
全て表示させたいのですが、7月1日の日報データしか表示させることができません。

→全て表示させたいです。解決方法を教えていただければ幸いです。

スクリーンショット 2022-07-04 17.13.21.png

該当するソースコード

<select class="form-select rounded-pill mb-3" aria-label="Default select example">
      <option selected>カレンダー</option>
      <option>2022/6</option>
    </select>

    <table class="table table-bordered">
      <thead>
        <tr class="bg-light">
          <th scope="col">日</th>
          <th scope="col">出勤</th>
          <th scope="col">退社</th>
          <th scope="col">休憩</th>
          <th scope="col">業務内容</th>
          <th scope="col"> </th>
        </tr>
      </thead>
      <tbody class="bg-white">

        <?php for ($i = 1; $i <= $day_count; $i++): ?>
          <?php
          $start_time = '';
          $finish_time = '';
          $rest_time = '';
          $comment = '';

          if (isset($work[date('Y-m-d', strtotime($yyyymm.'-'.$i))])) {
            $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];

            if ($work['start_time']) {
              $start_time = date('H:i', strtotime($work['start_time']));
            }

            if ($work['finish_time']) {
              $finish_time = date('H:i', strtotime($work['finish_time']));
            }

            if ($work['rest_time']) {
              $rest_time = date('H:i', strtotime($work['rest_time']));
            }

            if ($work['comment']) {
              $comment = mb_strimwidth($work['comment'], 0, 40, '...');
            }
          }
          ?>

          <tr>
            <th scope="row"><?=time_format_dw($yyyymm.'-'.$i)?></th>
            <td><?= $start_time ?></td>
            <td><?= $finish_time ?></td>
            <td><?= $rest_time ?></td>
            <td><?= $comment ?></td>
            <td><i class="fa-solid fa-pen-to-square"></i></td>
          </tr>

        <?php endfor; ?>
      </tbody>
    </table>
  </form>

自分で試したこと

・デバッグコードを入れて、データが全て取得できていることを確認しました。
・id=1の7月1日のデータを削除すると、id=2の7月2日のデータだけ表示されるようになります。

0

9Answer

失礼いたしました。dd() は laravel フレームワークの function でした

7/2 以降の値が取得出来ない原因は下記コードですね

$work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];

$i = 1 の時、$work 配列には 7/1 ~ 7/31 までの情報が格納されていますが、上記コードによって $work 配列の値が 7/1 の値で上書きされてしまい、7/2 以降の値が消失しています。

下記コードで正常に動作すると思います

if (isset($work[date('Y-m-d', strtotime($yyyymm.'-'.$i))])) {
    // 修正。$work ではなく $day に格納
    // $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];            
    $day = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];

    if ($day['start_time']) {
        $start_time = date('H:i', strtotime($day['start_time']));
    }

    if ($day['finish_time']) {
        $finish_time = date('H:i', strtotime($day['finish_time']));
    }

    if ($day['rest_time']) {
        $rest_time = date('H:i', strtotime($day['rest_time']));
    }

    if ($day['comment']) {
        $comment = mb_strimwidth($day['comment'], 0, 40, '...');
    }
}
2Like

Comments

  1. @blue-chicken

    Questioner

    @kazumacchi様

    大変ありがとうございます。いただいたコードで、正常に動作いたしました!!
    私の拙い日本語から、問題点を具体的に導き、対処方法を示して下さり、
    誠にありがとうございました。

    無事、問題解決いたしました。
    重ね重ねお礼申し上げます。
  2. @blue-chicken

    Questioner

    @kazumacchi様

    再度失礼いたします。
    教えていただいたコードで上手くいったのですが、

    「i=1の時、i=1の時、work 配列には 7/1 ~ 7/31 までの情報が格納されていますが、上記コードによって $work 配列の値が 7/1 の値で上書きされてしまい、7/2 以降の値が消失しています。」

    この説明をさらに噛み砕いた説明をいただくことは可能ですか?
    既に分かりやすくご配慮をいただいた説明をされている中で大変恐縮ですが、
    ご都合の宜しいお時間にご回答いただければ幸いです。
    宜しくお願い申し上げます。
  3. 読みづらいので移動します

for ループ2回目以降、下記の if が true になっていないため、7/2から空になっていると推測されます

if (isset($work[date('Y-m-d', strtotime($yyyymm.'-'.$i))])) {

コードを分割して、問題を特定しましょう

$i = 2 の場合、date() の値がどうなっているか

$date = date('Y-m-d', strtotime($yyyymm.'-'.$i));
// デバッグコード追加
if ($i === 2) {
    dd($date);
}
if (isset($work[$date])) {

$work 配列を出力、date() で取得した key が存在しているか

$date= date('Y-m-d', strtotime($yyyymm.'-'.$i));
dd($work);
if (isset($work[$date])) {
1Like

画像貼っていただいておりますが、dd() の値が出力されていないですね
dd() に $ がついているので、こちらを除去して実行お願いできますでしょうか

      <?php for ($i = 1; $i <= $day_count; $i++): ?>
      <?php
      $start_time = '';
      $finish_time = '';
      $rest_time = '';
      $comment = '';

      $date = date('Y-m-d', strtotime($yyyymm.'-'.$i));
      // デバッグコード追加
      if ($i === 2) {
          // 修正箇所
          // $dd($date);
          dd($date);
      }
     
      if (isset($work[$date])) {
      $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];
      <?php for ($i = 1; $i <= $day_count; $i++): ?>
      <?php
      $start_time = '';
      $finish_time = '';
      $rest_time = '';
      $comment = '';



      $date= date('Y-m-d', strtotime($yyyymm.'-'.$i));
      // 修正箇所
      // $dd($work);
      dd($work);
      if (isset($work[$date])) {
      $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];
1Like

@kazumacchi 様、@murase131

ご指摘ありがとうございます。
私の勉強不足で失礼いたしました。
デバッグ処理の一つだったのですね。

ご指摘いただいた事項を修正して実行して見たのですが、なぜかdd関数を使用すると、
エディタ内でファンクションが定義されていないと、エラー表示がでます。var_dump()
であれば使用可能でしたので、役に立つかと思い、一旦var_dump()で出力させた画面
表示の画像を添付いたします。

引き続きdd関数で出力できるように、原因追求いたします。
何卒宜しくお願いいたします。

スクリーンショット 2022-07-05 16.07.21.png

スクリーンショット 2022-07-05 16.09.46.png

1Like

$work 配列を出力、date() で取得した key が存在しているか

$work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];
echo $i;   //何日の値か
echo('<pre>');  // var_dumpが綺麗にに表示
var_dump($work);
echo('</pre>');
echo “<br>“;  //改行タグ

$workをvar_dumpするとわかりやすいと思う。

 < pre>タグについて
https://mww.hatenablog.com/entry/2015/11/20/190834

1Like

Comments

  1. @blue-chicken

    Questioner

    <pre>タグを使用すると、並んでかつ型まで表示されて非常に分かりやすくなりました。
    ありがとうございます。

    @murase131様が作成されている記事の方も合わせて、今後も活用させていただきます。
    ありがとうございました。

$i = 1 の時点で、work 配列の中身は下記の通りだと思います。

$work = [
    '2022-07-01' => [
        'id' => '1',
        'user_id' => '1',
        'start_time' => '09:00:00',
        'finish_time' => '18:00:00',
        'rest_time' => '01:00:00',
        'comment' => 'テスト テスト'
    ],
    '2022-07-02' => [
        // 略
    ],
    '2022-07-03',
    '2022-07-04',
    '2022-07-05',
    // .. 2022-07-31 まで繰り返し
];

下記のコードが実行されると、$work['2022-07-01'] のキーの値が取得されます

$work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];
// 結果
// [
//         'id' => '1',
//         'user_id' => '1',
//         'start_time' => '09:00:00',
//         'finish_time' => '18:00:00',
//         'rest_time' => '01:00:00',
//         'comment' => 'テスト テスト'
//     ]

// このコードは $work['2022-07-01'] の値を $work 配列に格納しているため
$work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];

// その時点で $work 配列の中身は下記になります
$work = [
    'id' => '1',
    'user_id' => '1',
    'start_time' => '09:00:00',
    'finish_time' => '18:00:00',
    'rest_time' => '01:00:00',
    'comment' => 'テスト テスト'
];

$i = 1 のループは正常終了しますが、work 配列の中は上記の通りのため、

// i = 2 の場合、'date('Y-m-d', strtotime($yyyymm.'-'.$i)) の結果は '2022-07-02'
// if (isset($work[date('Y-m-d', strtotime($yyyymm.'-'.$i))])) {
// 書き換え
if (isset($work['2022-07-02'])) {

$i = 2 の時点で '2022-07-02' のキーが work に存在せず、if 文の中を通りません

1Like

Comments

  1. @blue-chicken

    Questioner

    @kazumacchi 様

    何度も説明をいただき誠にありがとうございます。

    せっかく1ヶ月分のwork配列を取得したにも関わらず、改めて
    $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];の部分で、
    $work['2022-07-01'] の値を $work 配列に格納してしまっている。
    そのため、$i = 2 の '2022-07-02' のキーが work に存在せず、if 文の中を通過
    できなくなってしまっているということですね。

    今回の件で、どういった動作がされているのか、正しく理解できました。

    大変お時間を割いていただき、また丁寧にご指摘を下さりありがとうございました。
    今後とも宜しくお願いいたします。

ご回答ありがとうございます。
推測される問題点について理解できました。

ただ、意図された対処方法を取れているか自信がありませんので、
ご確認いただきたいです。

念のため、それぞれ出力した結果も画像で添付いたします。

どうぞ宜しくお願い申し上げます。

$i = 2 の場合、date() の値がどうなっているか

      <?php for ($i = 1; $i <= $day_count; $i++): ?>
      <?php
      $start_time = '';
      $finish_time = '';
      $rest_time = '';
      $comment = '';

      $date = date('Y-m-d', strtotime($yyyymm.'-'.$i));
      // デバッグコード追加
      if ($i === 2) {
      $dd($date);
      }
     
      if (isset($work[$date])) {
      $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];

$work 配列を出力、date() で取得した key が存在しているか

      <?php for ($i = 1; $i <= $day_count; $i++): ?>
      <?php
      $start_time = '';
      $finish_time = '';
      $rest_time = '';
      $comment = '';



      $date= date('Y-m-d', strtotime($yyyymm.'-'.$i));
      $dd($work);
      if (isset($work[$date])) {
      $work = $work[date('Y-m-d', strtotime($yyyymm.'-'.$i))];
0Like

$i = 2 の場合、date() の値がどうなっているか
スクリーンショット 2022-07-05 12.01.35.png

$work 配列を出力、date() で取得した key が存在しているか
スクリーンショット 2022-07-05 13.32.20.png

0Like

Your answer might help someone💌