我的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
上面显示。
答案 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并收集循环内的相关游戏),我会留给您尝试学习