0

私の PHP には、$console、$model、$game の 3 つの配列があります。

ちなみにコードは次のとおりです。

<?PHP
    $console = array();
    $model = array();
    $game = array();

    $gameQuery = "SELECT * FROM consoleGame";
    $gameResult = mysql_query($gameQuery) or die(mysql_error());

    while ($row = mysql_fetch_assoc($gameResult)) {
        if(!is_array($game[$row['modelId']])) {
            $game[$row['modelId']] = array();
        }

         $game[$row['modelId']][$row['gameId']] = array(
                                        'Game Name' => $row['gameName'],
                                        'Game ID' => $row['gameId']);
    }

    $modelQuery = "SELECT * FROM consoleModel";
    $modelResult = mysql_query($modelQuery) or die(mysql_error());

    while ($row = mysql_fetch_assoc($modelResult)) {
        if (!is_array($model[$row['consoleId']])) {
            $model[$row['consoleId']] = array();
        }

        $model[$row['consoleId']][$row['modelId']] = array(
                                        'Model Name' => $row['modelName'],
                                        'Model ID' => array_values($game[$row['modelId']])); //This is the warning by the way.
    }

    $consoleQuery = "SELECT * FROM consoleConsole";
    $consoleResult = mysql_query($consoleQuery) or die(mysql_error());

    while ($row = mysql_fetch_assoc($consoleResult)) {
        if (!is_array($console[$row['consoleId']])) {
            $console[$row['consoleId']] = array();
        }

        $console[$row['consoleId']] = array(
                                        'Console Name' => $row['consoleName'],
                                        'Console ID' => array_values($model[$row['consoleId']]));
    }

    $console = array_values($console);
    echo json_encode($console);
?>

コードでわかるように、問題なく $console と $model に array_values を追加しました。あの頃の私は幸運でした。$game に array_values を追加すると、警告が表示されます。これに対する可能な修正は何ですか?

私が宣言した追加情報$console$modelおよび$gameとしてarray()。上に表示されない理由がわかりません$gameQuery

4

3 に答える 3

1

$game = array() のように使用する前に、最初に $game を配列として宣言してから、array_value を $game に追加する場所をお知らせください。

次に、 is_array($game) を array_values に追加する前に使用できます。これは、配列であるかどうかです。

于 2013-02-07T19:07:45.050 に答える
0

$consoleあなたは最初の場所で your を配列として定義しているようには見えません。$console = array()先頭付近に追加します。

于 2013-02-07T19:11:32.777 に答える
0

データベースから結果を取得するために 3 つの異なるクエリを使用しています。$game 配列に「modelId」のキーが存在するかどうかを「チェック」しますが、特定のモデルのゲームが存在しない可能性があります。

この行は、modelId がまだ存在していない場合に$game配列にキーが追加されることを保証します

if(!is_array($game[$row['modelId']])) {
    $game[$row['modelId']] = array();
}

ただし、2 番目のループでは、すべてのSELECT * FROM consoleModelモデルをロードした結果、データベースにゲームがない可能性があるため、$game 配列にその modelId のキーはありません。

例えば:

コンソールゲーム

gameName | gameId | modelId
GameA    | 1      | 1
GameB    | 2      | 1

コンソールモデル

modelName| modelId
ModelA   | 1
ModelB   | 2

これにより、ModelA には 2 つのゲームが含まれますが、ModelB には含まれません。

$modelResultこれをループ内にも追加することで、この問題を回避できます。

if (!is_array($model[$row['consoleId']])) {
    $game[$row['modelId']] = array();
}

いくつかのアイデア

データを収集する方法は、データベースの「力」を実際には使用していません。データベースは、データと関連データを取得するように設計されています(したがって、「リレーショナル データベース」という名前が付けられています)。

たとえば、そのモデルのゲーム (存在する場合) を含むすべての consoleModels を収集するには、これを使用します。

SELECT
   consoleModel.modelId,
   consoleModel.modelName,
   consoleGame.gameId,
   consoleGame.gameName
FROM
    consoleModel
    -- Using 'LEFT' join so that consoleModels without games will also be returned
    LEFT JOIN consoleGame
      ON consoleGame.modelId = consoleModel.modelId

どちらが返されますか。

modelId | modelName | gameId | gameName
1       | ModelA    | 1      | GameA
1       | ModelA    | 1      | GameA
2       | ModelB    | NULL   | NULL

これにより ModelName 行が複製されますが、3 つの別々のループを実行する必要がないため、作業が簡単になる場合があります。

モードに最適化されたオプションが可能になります (例: PHP ですべての consoleModels をループし、ループ内で関連するゲームを収集する)。

于 2013-02-07T20:39:53.367 に答える