[英]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.