在我的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时,它会创建一个警告。对此有什么可能的解决办法?
附加信息i声明$console、$model和$game为array()。我不知道为什么它没有显示在$gameQuery上面。
发布于 2013-02-07 20:39:53
您使用三种不同的查询从数据库中获取结果,虽然您要“检查”$game数组中的“$game”键是否存在,但是对于特定的模型,可能不存在任何游戏;
这一行保证,如果$game数组还没有出现,则键将被添加到该数组中。
if(!is_array($game[$row['modelId']])) {
$game[$row['modelId']] = array();
}但是,在第二个循环中,使用SELECT * FROM consoleModel的结果加载所有模型,可能有些模型在数据库中没有游戏,因此$game数组中没有该modelId的键。
例如:
consoleGame
gameName | gameId | modelId
GameA | 1 | 1
GameB | 2 | 1consoleModel
modelName| modelId
ModelA | 1
ModelB | 2这将有两个游戏为ModelA,但没有为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-07 19:07:45
首先,在使用$game之前将其声明为数组,例如$game = array(),然后请告诉我们要将array_value添加到$game的位置。
其次,您可以在将is_array($game)添加到array_values (即它是否为数组)之前使用它。
发布于 2013-02-07 19:11:32
您似乎没有将$console定义为firat位置中的一个数组。在开头的某个地方添加$console = array()。
https://stackoverflow.com/questions/14758900
复制相似问题