繁体   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