アドバイスなど,コメント頂けると嬉しいです。
食堂の予約システムの開発中,ユーザ画面の商品一覧を作っていたときのお話です。
バグの詳細
ダミーの属性を持つ,画像のない謎の四角が表示されるようになった。

原因を確認したところ、日替わりのメニューの価格を管理するために登録していたダミーデータが表示されているようです。
<a href="goods.php?code=1020000">
<div class="menu-card">
<img src="" class="menu-image">
<span class="menu-name"></span>
</div>
</a>
ダミーデータが存在する理由
私が導入を目指している食堂には,日替わり丼・日替わり定食という制度があります。
内容は毎日変わりますが,価格などの詳細は共通です。
そのため,価格管理のテーブルに共通要素をまとめたダミーデータを用意しました。
| code | name | image | price |
|---|---|---|---|
| 1010000 | ["basic":450,"big":550] | ||
| 1020000 | ["basic":550,"big":650] | ||
| 1030001 | 恒常メニュー1 | 3-1.png | ["basic":400,"big":450] |
| 1030002 | 恒常メニュー2 | 3-2.png | ["basic":400,"big":450] |
試行錯誤の内訳
foreachの中でのunset()
一覧からダミーデータを除外するために,foreachの中でunset()を試しました。
しかし,ページ内で共通利用していた配列まで変更してしまい,日替わりメニューの価格取得にも影響が出てしまいました。
foreach($b as $a=>&$c){
if($c["code"]%10000==0){
unset($b[$a]);
continue;
}
}
バグの原因と解決
価格取得で利用する元の配列は変更せず,表示用のデータだけを新しい配列へコピーするようにしたことで,正常に動作しました。
$t=[];
foreach($n as $o){
if($o["code"]%10000==0) continue;
$o["image"]=ImgCheck("items/".$o["image"]);
$t[]=$o;
}
$item=ToJS($t);
これなら
- ダミーデータは除外される
- 元の配列は壊れない
- 処理の意図も分かりやすい
というメリットがあります。
最後に
ダミーデータは必要であり,この設計が悪かったわけではありません。
今回の件で、「内部処理で利用するデータ」と「画面へ表示するデータ」は必ずしも同じである必要はないと学びました。
さらに,バグに気が付かないままに作業を進めてしまったことも,解決に時間がかかった理由であったと思います。
ここまでお読み頂き,ありがとうございました。