【问题标题】:How to set sub json array in one array PHP如何在一个数组PHP中设置子json数组
【发布时间】:2018-06-07 20:05:07
【问题描述】:

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

【问题讨论】:

    标签: php arrays json phpmyadmin


    【解决方案1】:

    在您的 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。如果您在data 中使用category_id 作为键,则防止覆盖多个类别

    【讨论】:

    • 谢谢!供您参考:)
    • 我应该怎么做才能不重复我的 categoty_id ??
    【解决方案2】:

    我建议您在获取类别及其相关产品的记录时使用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); ?>
    

    我没有测试过,只是给你一个想法。我希望你能改进它。

    【讨论】:

    • 它确实有效!非常感谢:)
    【解决方案3】:

    //希望有用..

    $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 ..
    

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多