首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >警告: array_values()期望参数1为数组,空给定

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

Stack Overflow用户
提问于 2013-02-07 19:02:11
回答 3查看 9.1K关注 0票数 0

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

顺便提一句,这是代码:

代码语言:javascript
复制
<?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时,它会创建一个警告。对此有什么可能的解决办法?

附加信息i声明$console$model$gamearray()。我不知道为什么它没有显示在$gameQuery上面。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-07 20:39:53

您使用三种不同的查询从数据库中获取结果,虽然您要“检查”$game数组中的“$game”键是否存在,但是对于特定的模型,可能不存在任何游戏;

这一行保证,如果$game数组还没有出现,则键将被添加到该数组中。

代码语言:javascript
复制
if(!is_array($game[$row['modelId']])) {
    $game[$row['modelId']] = array();
}

但是,在第二个循环中,使用SELECT * FROM consoleModel的结果加载所有模型,可能有些模型在数据库中没有游戏,因此$game数组中没有该modelId的键。

例如:

consoleGame

代码语言:javascript
复制
gameName | gameId | modelId
GameA    | 1      | 1
GameB    | 2      | 1

consoleModel

代码语言:javascript
复制
modelName| modelId
ModelA   | 1
ModelB   | 2

这将有两个游戏为ModelA,但没有为ModelB。

您也可以通过在$modelResult循环中添加此内容来解决此问题。

代码语言:javascript
复制
if (!is_array($model[$row['consoleId']])) {
    $game[$row['modelId']] = array();
}

几点想法

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

例如,收集所有的consoleModels,包括该模型的游戏(如果有的话)使用这个;

代码语言:javascript
复制
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

会回来的;

代码语言:javascript
复制
modelId | modelName | gameId | gameName
1       | ModelA    | 1      | GameA
1       | ModelA    | 1      | GameA
2       | ModelB    | NULL   | NULL

尽管这将重复ModelName行,但它可能会使您更容易,因为您不必运行3个单独的循环。

模式优化选项将是可能的(例如,通过PHP中的所有consoleModels循环并收集循环中的相关游戏),我将让您尝试并学习这些选项。

票数 0
EN

Stack Overflow用户

发布于 2013-02-07 19:07:45

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-07 19:11:32

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14758900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档