首先,对不起,如果标题已关闭......这是我能想到的最好的问题,我面临的问题。
在我的数据库中,我有一个应用列表。在PHP中,我从他们的密钥中提取数据,并将这些数据编码为JSON以打印出来(我正在制作API)。
但是,只有最后一个应用程序以JSON打印出来。我需要的是一个JSON数组,其中包含任何具有相同键的应用程序,以便稍后我可以循环遍历它们并打印出它们的数据。
我的代码:
$getApp = "SELECT * FROM tundra.apps WHERE app_key = '" . $api_key . "'";
$appData = $dbConnection->query($getApp);
if ($appData->num_rows > 0){ // Check if app_key exists
while($row = $appData->fetch_assoc()) { // While retrieving rows
$jsonApp = json_encode(array( // Encode the row data
"app_name" => $row['app_name'],
"app_theme" => array(
"primary_color" => $row['app_primary_color'],
"primary_color_dark" => $row['app_primary_dark_color'],
"accent_color" => $row['app_accent_color'],
),
"app_navigation" => $row['app_navigation'],
"author_info" => array(
"author_name" => $row['app_author_name'],
"author_bio" => $row['app_author_bio'],
"links" => array(
"website" => $row['app_author_website'],
"googleplus" => $row['app_author_gplus'],
"twitter" => $row['app_author_twitter'],
"dribble" => $row['app_author_dribble'],
"behance" => $row['app_author_behance'],
)
),
"app_status" => $row['app_status']
), JSON_UNESCAPED_SLASHES);
}
// Format and print JSON data
echo "<pre>" . prettyPrint($jsonApp) . "</pre>";
} else { // No key found, encode error
$jsonError = json_encode(
array(
array(
"error" => array(
"code" => "8",
"message" => "Invalid API key specified"
)
)
), JSON_UNESCAPED_SLASHES);
echo "<pre>" . prettyPrint($jsonError) . "</pre>";
}
对于上面的内容,我尝试在while循环中回显JSON数据,但是(如预期的那样)为每一行打印<pre>
。
以下是上述代码的JSON输出:
{
"app_name":"Andrew's Second App",
"app_theme":{
"primary_color":"#FFFFFF",
"primary_color_dark":"#E0E0E0",
"accent_color":"#E91E63"
},
"app_navigation":"0",
"author_info":{
"author_name":"Andrew Quebe",
"author_bio":"I'm a developer of stuff.",
"links":{
"website":"http://www.andrewquebe.com",
"googleplus":"https://plus.google.com/+AndrewQuebe",
"twitter":"https://twitter.com/andrew_quebe",
"dribble":"None",
"behance":"None"
}
},
"app_status":"1"
}
注意:数据格式完美,但我需要数据在数组中,我不确定如何执行此操作。
答案 0 :(得分:1)
在您的while循环中,您不断地将值重新设置为$jsonApp
。我建议添加更多这样的值:
$getApp = "SELECT * FROM tundra.apps WHERE app_key = '" . $api_key . "'";
$appData = $dbConnection->query($getApp);
if ($appData->num_rows > 0){ // Check if app_key exists
for($i=0;$row = $appData->fetch_assoc();i++) { // While retrieving rows
$jsonApp[i] = array( // Encode the row data
"app_name" => $row['app_name'],
"app_theme" => array(
"primary_color" => $row['app_primary_color'],
"primary_color_dark" => $row['app_primary_dark_color'],
"accent_color" => $row['app_accent_color'],
),
"app_navigation" => $row['app_navigation'],
"author_info" => array(
"author_name" => $row['app_author_name'],
"author_bio" => $row['app_author_bio'],
"links" => array(
"website" => $row['app_author_website'],
"googleplus" => $row['app_author_gplus'],
"twitter" => $row['app_author_twitter'],
"dribble" => $row['app_author_dribble'],
"behance" => $row['app_author_behance'],
)
),
"app_status" => $row['app_status']
);
}
$json = json_encode($jsonApp,JSON_UNESCAPED_SLASHES);
// Format and print JSON data
echo "<pre>" . prettyPrint($json) . "</pre>";
} else { // No key found, encode error
$jsonError = json_encode(
array(
array(
"error" => array(
"code" => "8",
"message" => "Invalid API key specified"
)
)
), JSON_UNESCAPED_SLASHES);
echo "<pre>" . prettyPrint($jsonError) . "</pre>";
}
这应该显示一个JSON数组,数组中的每个元素代表一个单独的app条目。
答案 1 :(得分:1)
问题是,您在json_encode()
循环的每次迭代中都应用了while()
函数,而且还要覆盖$jsonApp
in {每次迭代。这就是为什么你 输出的原因。
解决方法是,在while()
循环之外创建一个空结果数组。在while()
循环的每次迭代中,将数组数组推入结果数组中。最后,在退出循环后,在结果数组上应用json_encode()
函数并显示它。
所以你的代码应该是这样的:
// your code
if ($appData->num_rows > 0){ // Check if app_key exists
$resultArr = array();
while($row = $appData->fetch_assoc()) { // While retrieving rows
$resultArr[] = array( // Encode the row data
"app_name" => $row['app_name'],
"app_theme" => array(
"primary_color" => $row['app_primary_color'],
"primary_color_dark" => $row['app_primary_dark_color'],
"accent_color" => $row['app_accent_color'],
),
"app_navigation" => $row['app_navigation'],
"author_info" => array(
"author_name" => $row['app_author_name'],
"author_bio" => $row['app_author_bio'],
"links" => array(
"website" => $row['app_author_website'],
"googleplus" => $row['app_author_gplus'],
"twitter" => $row['app_author_twitter'],
"dribble" => $row['app_author_dribble'],
"behance" => $row['app_author_behance'],
)
),
"app_status" => $row['app_status']
);
}
$jsonApp = json_encode($resultArr, JSON_UNESCAPED_SLASHES);
// Format and print JSON data
echo "<pre>" . prettyPrint($jsonApp) . "</pre>";
} else { // No key found, encode error
$jsonError = json_encode(
array(
array(
"error" => array(
"code" => "8",
"message" => "Invalid API key specified"
)
)
), JSON_UNESCAPED_SLASHES);
echo "<pre>" . prettyPrint($jsonError) . "</pre>";
}
答案 2 :(得分:0)
我相信这是因为在你的例子的第6行,你将json_encode的输出分配给$ jsonApp变量。使用像这样的数组会更容易。
$jsonApp[] = array(
然后在最后使用json_encode。
echo "<pre>" . prettyPrint(json_encode($jsonApp)) . "</pre>";
答案 3 :(得分:0)
这是JSON的格式。您无法输出不同的形状。但是,在解码此JSON输出时,您可以解码objcet或array。
$object = json_decode($json);
$array = json_decode($json, true);