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