リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 合体ドロップ
タイトル画面モードカードの「今週の1位」表示でプレイヤー名キー不一致によりPHP Notice/空欄表示
1. 不具合の内容:
タイトル画面の各モードカードに表示される「今週の1位」プレイヤー名が正しく表示されない(空欄になる、またはPHP Notice: Undefined array keyが発生する)可能性があります。
2. 根拠・発生しそうな条件:
pages/play.php の該当箇所を確認すると、
```
foreach (array_keys(vd_modes()) as $mode) {
$rows = vd_weekly_top_scores(app_db(), $mode, $week_start, $week_end, 1);
if (isset($rows[0])) {
$weekly_top_scores[$mode] = $rows[0];
}
}
```
と、vd_weekly_top_scores() が返す生のSQL結果行をそのまま $weekly_top_scores[$mode] に格納しています。この生データのキー名は player_name であることが pages/rank_check.php の同関数利用箇所で確認できます (`$weeklyTop['player_name']`, `$todayTop['player_name']`)。
一方、同じ play.php テンプレート内で「今日の1位」を表示する箇所は `$today_top_scores[$mid]['name']` のように 'name' キーでアクセスしており、vd_today_top_scores() は 'name'/'score' という正規化済みキーの配列を返す設計になっていることが分かります。
もし「今週の1位」表示テンプレート(data-today-top-mode に対応する data-weekly-top-mode 相当の箇所、コード末尾が切り詰められているため直接確認はできないものの、直前の「今日の1位」表示と同じ実装パターンを踏襲していると推測される)が同様に `$weekly_top_scores[$mid]['name']` でアクセスしている場合、実データのキーは 'player_name' であるため 'name' キーは存在せず、PHP Notice: Undefined array key "name" が発生し、今週の1位のプレイヤー名欄が空文字表示になります。v1.78.0のリリースノートで「タイトル画面の各モードカードに、今週の1位プレイヤー名とスコアを表示するようにしました」と明記されており、今日の1位実装(既存)からのキー命名規則の不統一がそのまま持ち込まれた可能性が高いです。
3. 期待動作:
今週データが存在するモードでは、今日の1位表示と同様に正しいプレイヤー名とスコアが「🥇 プレイヤー名 スコア」の形式でモードカードに表示されること。データがない場合は従来通り非表示になること。
4. 修正方針:
pages/play.php 内で $weekly_top_scores を構築する際、vd_weekly_top_scores() の生の結果行 (player_name, score) を、今日の1位表示と同じキー構造 (['name' => $row['player_name'], 'score' => (int)$row['score']]) に変換してから格納する。あわせて今週の1位を表示するHTMLテンプレート側でも 'name' キーで統一してアクセスしていることを確認し、キー不一致が残っていないか全体を点検・修正する。修正後はPHP error_logにNoticeが出ていないこと、各モードで今週データがある場合に正しくプレイヤー名が表示されることを目視確認する。
タイトル画面の各モードカードに表示される「今週の1位」プレイヤー名が正しく表示されない(空欄になる、またはPHP Notice: Undefined array keyが発生する)可能性があります。
2. 根拠・発生しそうな条件:
pages/play.php の該当箇所を確認すると、
```
foreach (array_keys(vd_modes()) as $mode) {
$rows = vd_weekly_top_scores(app_db(), $mode, $week_start, $week_end, 1);
if (isset($rows[0])) {
$weekly_top_scores[$mode] = $rows[0];
}
}
```
と、vd_weekly_top_scores() が返す生のSQL結果行をそのまま $weekly_top_scores[$mode] に格納しています。この生データのキー名は player_name であることが pages/rank_check.php の同関数利用箇所で確認できます (`$weeklyTop['player_name']`, `$todayTop['player_name']`)。
一方、同じ play.php テンプレート内で「今日の1位」を表示する箇所は `$today_top_scores[$mid]['name']` のように 'name' キーでアクセスしており、vd_today_top_scores() は 'name'/'score' という正規化済みキーの配列を返す設計になっていることが分かります。
もし「今週の1位」表示テンプレート(data-today-top-mode に対応する data-weekly-top-mode 相当の箇所、コード末尾が切り詰められているため直接確認はできないものの、直前の「今日の1位」表示と同じ実装パターンを踏襲していると推測される)が同様に `$weekly_top_scores[$mid]['name']` でアクセスしている場合、実データのキーは 'player_name' であるため 'name' キーは存在せず、PHP Notice: Undefined array key "name" が発生し、今週の1位のプレイヤー名欄が空文字表示になります。v1.78.0のリリースノートで「タイトル画面の各モードカードに、今週の1位プレイヤー名とスコアを表示するようにしました」と明記されており、今日の1位実装(既存)からのキー命名規則の不統一がそのまま持ち込まれた可能性が高いです。
3. 期待動作:
今週データが存在するモードでは、今日の1位表示と同様に正しいプレイヤー名とスコアが「🥇 プレイヤー名 スコア」の形式でモードカードに表示されること。データがない場合は従来通り非表示になること。
4. 修正方針:
pages/play.php 内で $weekly_top_scores を構築する際、vd_weekly_top_scores() の生の結果行 (player_name, score) を、今日の1位表示と同じキー構造 (['name' => $row['player_name'], 'score' => (int)$row['score']]) に変換してから格納する。あわせて今週の1位を表示するHTMLテンプレート側でも 'name' キーで統一してアクセスしていることを確認し、キー不一致が残っていないか全体を点検・修正する。修正後はPHP error_logにNoticeが出ていないこと、各モードで今週データがある場合に正しくプレイヤー名が表示されることを目視確認する。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (vegetable-drop))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris