我是 php 的新手,我试图从以下响应中获取数据,但我想在子数组中设置此数据。这该怎么做?我有两个不同的表category
和Product
。如何明智地展示多种产品。
提前致谢!
{
"data" : [
{
"id" : "1",
"recipe_name" : "Tofu Tikka",
"ingredients" : "Firm tofu 1 pack (bite sized cube)\r\n",
"prepration" : "Press tofu with the help of plate to remove moisture
and leave for 30-40 minutes, then cut in cubes.\r\n",
"category_id":"1",
"category_name":"Today's Menu"
}
]
}
如何在子数组中设置上述响应,如下所示
{
"data":[
"category_id":"1",
"category_name":"Today's Menu"
"recipes::[
{
"id":"1",
"recipe_name":"Tofu Tikka",
"ingredients":"Firm tofu 1 pack ",
"prepration":"Press tofu with the help of plate"
}, {
"id":"2",
"recipe_name":"Tikka Paneer",
"ingredients":"Firm tofu 1 pack ",
"prepration":"Press tofu with the help of plate"
},
]
]
}
以下是我的PHP文件
<?php
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
// include database and object files
include_once '../config/database.php';
include_once '../objects/product.php';
// instantiate database and product object
$database = new Database();
$db = $database->getConnection();
// initialize object
$product = new Product($db);
// query products
$stmt = $product->read();
$num = $stmt->rowCount();
// check if more than 0 record found
if ($num>0) {
// products array
$products_arr=array();
$products_arr["data"]=array();
// retrieve our table contents
// fetch() is faster than fetchAll()
// http://stackoverflow.com/questions/2770630/pdofetchall-vs-pdofetch-in-a-loop
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// extract row
// this will make $row['name'] to
// just $name only
extract($row);
$product_item=array(
"id" => $id,
"recipe_name" => $recipe_name,
"ingredients" => html_entity_decode($ingredients),
"prepration" => $prepration,
"category_id" => $category_id,
"category_name" => $category_name
);
array_push($products_arr["data"], $product_item);
}
echo json_encode($products_arr);
} else {
echo json_encode(
array("message" => "No products found.")
);
}
?>
答案 0 :(得分:2)
在while循环中,您可以先通过category_id
对食谱进行分组,而不是推送整个行数组。然后使用array_values()
重新编制索引。
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// extract row
// this will make $row['name'] to
// just $name only
extract($row);
// Check if category_id is already set
if (!array_key_exists($category_id, $products_arr["data"])) {
$products_arr["data"][$category_id] = array(
"category_id" => $category_id,
"category_name" => $category_name,
"recipes" => []
);
}
// Push the recipe details
$products_arr["data"][$category_id]["recipes"][] = array(
"id" => $id,
"recipe_name" => $recipe_name,
"ingredients" => html_entity_decode($ingredients),
"prepration" => $prepration
);
$products_arr["data"] = array_values($products_arr["data"]);
}
echo json_encode($products_arr);
注意:输出与预期结果略有不同。因为输出的data
键具有基于类别的数组而不是category_id
。如果您在category_id
内使用data
作为键,则可防止覆盖多个类别
答案 1 :(得分:1)
我建议您在获取类别及其相关产品的记录时使用JOIN。它需要单个查询和单循环来生成您想要的数组。以下是您可以使用的示例查询。它将获得每个产品记录的类别名称,而不显示那些没有产品的类别。
SELECT * FROM categories AS c LEFT JOIN offers AS p ON c.category_id=p.category_id WHERE p.offer_id IS NOT NULL
注意: - 请勿在搜索查询中使用星号(*),而应使用表字段名称。
<?php
// initialize empty category array
$categoryArr = [];
// $row has product info with category id and name in it.
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
/* First key of categoryArr variable is category id. It will automatically create array key for each category.
* If an array key already exists, it will add prodcts in it.
*/
$categoryArr[$row['category_id']]['category_id'] = $row['category_id'];
$categoryArr[$row['category_id']]['category_name'] = $row['category_name'];
$categoryArr[$row['category_id']]['products'][] = $row;
}
/* Once loop done with its work. Need to reset array keys with the help of below function. */
$result = array_values($categoryArr);
echo json_encode($result); ?>
我还没有测试过,它只是为了给你一个想法。我希望你能改进它。
答案 2 :(得分:0)
//我希望它有用......
$returnArr = array('category_id' => $category_id,'category_name' => $category_name,$products_arr["data"]); // in last "$products_arr["data"]" set your dynamic code ..
$arr = array('recipes' => $returnArr);
echo json_encode($arr['recipes']); // print json ..