簡體   English   中英

用php上的通用字段將json數據分組

[英]Group json data with common fields on php

在對服務器執行sql query(MYSQL)之后,我以json格式獲取數據,我想以某種方式將有關具有通用名稱的字段的數據分組。這是我在執行后處理數據和結果的代碼查詢。

<?php

$serverName = "localhost";
$userName = "root";
$password = "root";
$database = "eshop";

// Create connection with the database
$conn = new mysqli($serverName, $userName, $password , $database);

//Retrieves the two values sent from the ajax request
$userName = $_GET["userName"];

// Check the status of the connection
if ($conn->connect_error)
{
    alert("The connection has timed-out!!!");
    die("Connection failed: " . $conn->connect_error);

}

else
{
    $data = new stdclass();
    $data->status = "";
    $past_orders = [];

    $previous_orders_sql =  mysqli_query($conn , 
     "SELECT order_products.order_id , order_date , product_id , price
      FROM   register , orders , order_products , products
      WHERE  register.user_id = orders.user_id
      AND    orders.order_id  = order_products.order_id
      AND    products.product_id = order_products.product_num
      AND    user_name = '$userName'");


    if(mysqli_num_rows($previous_orders_sql)>0)
    {

        $data->status = "OK";

        while($row = mysqli_fetch_array( $previous_orders_sql , MYSQLI_ASSOC))
        {
            $data-> past_orders[] = $row;
        }

    }

    else
    {
        $data->status = "Failed";
        mysqli_error($conn);
    }

}

echo json_encode($data);

?>

我得到的結果是:

{"past_orders":
[{"order_id":"1","order_date":"2012-12-27","product_id":"1","price":"12.40"},{"order_id":"1","order_date":"2012-12-27","product_id":"2","price":"32.00"},{"order_id":"1","order_date":"2012-12-27","product_id":"3","price":"25.00"},{"order_id":"3","order_date":"2016-01-12","product_id":"1","price":"12.40"},{"order_id":"3","order_date":"2016-01-12","product_id":"6","price":"28.00"},{"order_id":"3","order_date":"2016-01-12","product_id":"7","price":"37.00"},{"order_id":"4","order_date":"2014-04-06","product_id":"1","price":"12.40"},{"order_id":"4","order_date":"2014-04-06","product_id":"2","price":"32.00"},{"order_id":"4","order_date":"2014-04-06","product_id":"5","price":"13.50"}]}

因此,我希望有一些東西可以對有關order_id的數據進行分組(因為order_id和order_date對於某些結果是相同的),並且具有類似以下內容:

{"past_orders":

[{"order_id":"1","order_date":"2012-12-27", "products":["product_id":"1","price":"12.40"},"product_id":"2","price":"32.00"},"product_id":"3","price":"25.00"}],

{"order_id":"3","order_date":"2016-01-12","products":["product_id":"1","price":"12.40"},{"product_id":"6","price":"28.00"},{"product_id":"7","price":"37.00"}],

{"order_id":"4","order_date":"2014-04-06","products":["product_id":"1","price":"12.40"},{"product_id":"2","price":"32.00"},{"product_id":"5","price":"13.50"}]}

如果答案需要任何其他代碼,請讓我知道將其發布。

我將以這種方式重做您的while迭代:

    while ($row = mysqli_fetch_array($previous_orders_sql, MYSQLI_ASSOC)) {

        if (!isset($data->past_orders[$row['order_id']])) {
            $order_arr = array(
                "order_id" => $row['order_id'],
                "order_date" => $row['order_date']
            );
            $data->past_orders[$row['order_id']] = $order_arr;
        }

        $data->past_orders[$order['order_id']]['products'][] = array(
            "product_id" => $row['product_id'],
            "price" => $row['price']
        );
    }

這樣一來,您的結果就很好了:

array (size=3)
  0 => 
    array (size=3)
      'order_id' => int 1
      'order_date' => string '2012-12-27' (length=10)
      'products' => 
        array (size=3)
          0 => 
            array (size=2)
              'product_id' => int 1
              'price' => float 12.4
          1 => 
            array (size=2)
              'product_id' => int 2
              'price' => float 32
          2 => 
            array (size=2)
              'product_id' => int 3
              'price' => float 25
  1 => 
    array (size=3)
      'order_id' => int 3
      'order_date' => string '2016-01-12' (length=10)
      'products' => 
        array (size=2)
          0 => 
            array (size=2)
              'product_id' => int 1
              'price' => float 12.4
          1 => 
            array (size=2)
              'product_id' => int 6
              'price' => float 28
  2 => 
    array (size=3)
      'order_id' => int 4
      'order_date' => string '2014-04-06' (length=10)
      'products' => 
        array (size=3)
          0 => 
            array (size=2)
              'product_id' => int 1
              'price' => float 12.4
          1 => 
            array (size=2)
              'product_id' => int 2
              'price' => float 32
          2 => 
            array (size=2)
              'product_id' => int 5
              'price' => float 13.5

另外,您的SQL查詢效率也不高。 您應該改為使用JOINs

SELECT o.order_id, o.order_date, p.product_id, p.price
FROM orders as o 
JOIN register as r ON r.user_id=o.user_id
JOIN order_products as op ON op.order_id=o.order_id
JOIN products as p ON p.product_id=op.product_num
WHERE r.username = '$userName'

我知道您想重新構造此數據結構,以便更輕松地使用它。 簡單的版本可能是這樣的:

    while($row = mysqli_fetch_array( $previous_orders_sql , MYSQLI_ASSOC))
    {
        if(!isset($data->past_orders[$row['order_id']]))
          $data->past_orders[$row['order_id']] = array();
        }

        $data->past_orders[$row['order_id']][] = $row;
    }

如果確實需要,您可以進一步調整該數組以獲取所需的確切內容。

在按ID排序的查詢中放置另一行,然后在where語句中放置內部where。 像這樣:

 $previous_orders_sql =  mysqli_query($conn , 
 "SELECT order_products.order_id , order_date , product_id , price
  FROM   register , orders , order_products , products
  WHERE  register.user_id = orders.user_id
  AND    orders.order_id  = order_products.order_id
  AND    products.product_id = order_products.product_num
  AND    user_name = '$userName'
  order by orders.order_id desc");


if(mysqli_num_rows($previous_orders_sql)>0)
{

    $data->status = "OK";

    while($row = mysqli_fetch_array( $previous_orders_sql , MYSQLI_ASSOC))
    {
        $idvar = $row[order_id];

        while($row = mysqli_fetch_array( $previous_orders_sql , MYSQLI_ASSOC))
            {
             if ($row[order_id] == $idvar)
             $data-> past_orders[] = $row[order_date].$row[product_id].$row[price] etc etc etc;
            }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM