警告:array_values()期望参数1为数组,给定为null

时间:2013-02-07 19:02:12

标签: php mysql arrays

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

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

其他信息 我将$console$model$game声明为array()。我不知道为什么它没有在$gameQuery上面显示。

3 个答案:

答案 0 :(得分:1)

首先在使用它之前将$ game声明为数组,例如$ game = array()然后请告诉我们你要将array_value添加到$ game

第二个你可以使用is_array($ game)将它添加到array_values之前是不是数组

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

如果该modelId尚未出现,此行可确保将密钥添加到 $ game 数组中

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

然而,在第二个循环中,SELECT * FROM consoleModel加载所有模型的结果,可能有些游戏在您的数据库中没有游戏,因此该模型没有关键字在$ game数组中。

例如:

consoleGame

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

consoleModel

modelName| modelId
ModelA   | 1
ModelB   | 2

对于ModelA,这将有2场比赛,但对于ModelB则没有。

您可以通过在$modelResult循环中添加

来解决此问题
if (!is_array($model[$row['consoleId']])) {
    $game[$row['modelId']] = array();
}

一些想法

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

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

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中的所有consoleModel并收集循环内的相关游戏),我会留给您尝试学习