如何在一个数组PHP中设置子json数组

时间:2017-12-27 06:58:35

标签: php arrays json phpmyadmin

我是 php 的新手,我试图从以下响应中获取数据,但我想在子数组中设置此数据。这该怎么做?我有两个不同的表categoryProduct。如何明智地展示多种产品。

提前致谢!

{
    "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.")
        );
    }
?>

3 个答案:

答案 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 ..