在PHP中创建嵌套JSON对象

在PHP中创建嵌套JSON对象,php,json,Php,Json,我正在尝试创建一个JSON对象以提交给API 以下是我试图实现的一个示例: { packages: [ { orderNumber: 10000004, fulfillmentPackageId: "ShipCo #123456", warehouseId: 4, carrier: "USPS", trackin

我正在尝试创建一个JSON对象以提交给API

以下是我试图实现的一个示例:


{
    packages: [
        {
            orderNumber: 10000004,
            fulfillmentPackageId: "ShipCo #123456",
            warehouseId: 4,
            carrier: "USPS",
            tracking: "12345667890002394230",
            service_level: "First Class",
            products: [
                {sku: "testSku1", quantity: 5}
            ]
        },
        {
            orderNumber: 10000004,
            fulfillmentPackageId: "ShipCo #123457",
            warehouseId: 4,
            carrier: "USPS",
            tracking: "12345667890002394231",
            service_level: "Priority",
            products: [
                {sku: "testSku2", quantity: 1},
                {sku: "testSku3", quantity: 4}
            ]
        }
    ]
}

我可以创建它的主要部分没有问题,但我对“产品”部分感到困惑。它似乎是第一个json对象中的另一个json对象。我如何添加这个

我现在用它来创建对象的主体,它从一个MYSQL表中读取数据,这是在一个遍历表结果的循环中


        $package = new stdClass();

        $package->orderNumbner = $row['zentail_order_no'];
        $package->fulfillmentPackageId = $row['fulfillment_id'];
        $package->warehouseId = 2;
        $package->carrier = $row['carrier'];
        $package->tracking = $row['tracking'];
        $package->service_level = $row['service_level'];
        $package->products = getPackages($row['zentail_order_no']);

如您所见,我随后试图通过另一个函数getPackages()填充对象的产品部分

DB中有多行具有相同的订单号,但SKU和QTY的值不同,我希望当它在行上循环时,它会像使用arraypush()一样将这些行添加到对象中,然后将其添加到原始对象的products字段中

我确信这是一件相对简单的事情,我发现很难找到正确的术语来表达我想要表达的意思,所以寻找答案相当困难


谢谢

在您的函数中创建
$products
数组

但首先要开始使用绑定的、准备好的参数化查询来编写代码,以防止出现错误


您可以使用数组轻松创建JSON。根据您的示例,以下是解决方案:


您需要对getPackages函数进行最小的更改:

include 'sql/config.php';
include 'sql/opendb.php';

function getPackages($zentail_order_no){
    global $db;

    $products = [];
    
    $sql = "SELECT * FROM zentail WHERE zentail_order_no = '{$zentail_order_no}'";
    $result = $db->query($sql);
   
    if ($result->num_rows > 0) {
      while($row = $result->fetch_assoc()) {
            array_push($products, [
                'sku'=>$row['sku'],
                'qty'=>$row['qty']
            ]);  
      }
    }

    return $products;
}

这里有一个活生生的例子:

如果你把它全部放进一个嵌套数组,然后在该数组上使用
json_encode()
,你应该会没事的。哈哈,谢谢@incredblehat或者应该是
$thanker
没有争论,这是一个真正的感谢@incredblehat,特别是因为它没有像正常情况那样附带DV,一切都很好,我看到了这个傻瓜,我想,我会帮他修好的!我讨厌在答案上给DVs,这肯定是个糟糕的答案。你的好!说到这里,我只是强调一下关于SQL注入的重要注意事项。对于OP,一定要注意每个人在这方面给你的警告。它会救你的!
function getPackages($zentail_order_no){
   
    include 'sql/config.php';
    include 'sql/opendb.php';
   
    
    // select only what you need, makes the query quicker, 
    // and allows you fetch the object without more fiddling
    $sql = "SELECT sku, qty FROM zentail 
            WHERE zentail_order_no = ?";
    $stmt = $db->prepare($sql);
    $stmt->bind_param('i', $zentail_order_no);

    $db->execute($sql);
    $result = $stmt->get_result();
   
    $products = [];
    
    // now as you want an object, you can fetch the row as an object
    // rather than an array and then fiddle it into an object
    while($row = $result->fetch_object()) {
        $products[] = $row;
    }
    return $products;
}
include 'sql/config.php';
include 'sql/opendb.php';

function getPackages($zentail_order_no){
    global $db;

    $products = [];
    
    $sql = "SELECT * FROM zentail WHERE zentail_order_no = '{$zentail_order_no}'";
    $result = $db->query($sql);
   
    if ($result->num_rows > 0) {
      while($row = $result->fetch_assoc()) {
            array_push($products, [
                'sku'=>$row['sku'],
                'qty'=>$row['qty']
            ]);  
      }
    }

    return $products;
}