0

我的 PHP 中有 3 个数组,$console、$model 和 $game。

顺便说一下,这里是代码:

<?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);
?>

正如您在代码中看到的那样,我已将 array_values 添加到 $console 和 $model 中,没有任何问题。那时我很幸运。当我将 array_values 添加到 $game 时,它​​会创建一个警告。对此有什么可能的解决方法?

我声明的附加信息$console$model$game作为array(). 我不知道为什么上面没有显示$gameQuery

4

3 回答 3

1

首先将您的 $game 声明为一个数组,然后再使用它,例如 $game = array() 然后请告诉我们您要将 array_value 添加到 $game 的位置

其次,您可以使用 is_array($game) 在将其添加到 array_values 之前使用它是否为数组

于 2013-02-07T19:07:45.050 回答
0

您似乎没有$console在 firat 地方将您的定义为数组。$console = array()在开头附近的某个地方添加。

于 2013-02-07T19:11:32.777 回答
0

您正在使用三个不同的查询从数据库中获取结果,尽管您“检查”是否存在 $game 数组中“modelId”的键,但可能不存在特定模型的游戏;

此行保证如果该 modelId 尚不存在,则将密钥添加到$game数组

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

但是,在第二个循环中,由于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();
}

一些想法

您收集数据的方式并没有真正使用数据库的“力量”。数据库旨在检索数据和相关数据(因此称为“关系数据库”)

例如,要收集所有控制台模型,包括该模型的游戏(如果有),请使用此;

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 中的所有控制台模型并收集循环内的相关游戏),我将把它留给你去尝试和学习

于 2013-02-07T20:39:53.367 回答