如何通过数据库循环向PHP多维数组的PickItems子数组添加元素?
解决PHP数组中PickItems子数组的填充问题
完全没问题,我来帮你把这个数组填充的逻辑捋顺,顺便给你优化下代码细节!
首先,你关于array_push的思路是对的,不过其实还有更简洁的写法。我们先把order_items查询后的循环填充部分改对:
// 初始化空的商品数组 $Items = array(); if ($result2 = $mysqli->query("SELECT * FROM order_items WHERE client_id = {$client} AND main_order_id = {$row['platform_order_id']}")) { while($row2 = mysqli_fetch_assoc($result2)) { // 方法1:直接用数组赋值的方式添加元素(推荐,比array_push更直观) $Items[] = array( 'SKUNumber' => $row2['sku'], 'Quantity' => $row2['quantity'], 'Comments' => $row2['comments'] ); // 方法2:用array_push也可以,效果完全一样 // array_push($Items, array( // 'SKUNumber' => $row2['sku'], // 'Quantity' => $row2['quantity'], // 'Comments' => $row2['comments'] // )); } // 记得释放结果集,避免资源浪费 mysqli_free_result($result2); }
然后是主数组$params里的PickItems字段,你之前的写法array($Items)是多余的——因为$Items本身已经是一个包含多个商品子数组的数组了,直接赋值给PickItems就行:
$params = array( 'DeliveryCompanyName' => $row['company_name'], 'DeliveryAddress1' => $row['address1'], 'DeliveryAddress2' => $row['address2'], 'DeliveryCity' => $row['city'], 'DeliveryCounty' => $row['province'], 'DeliveryPostCode' => $row['postcode'], 'DeliveryCountry' => $row['country'], 'DeliveryPhone' => $row['phone'], 'DeliveryContact' => $row['first_name'] . " " . $row['last_name'], 'OutboundRef' => $row['order_number'], 'PickItems' => $Items, // 直接用$Items,不需要再套一层array() 'BranchID' => '', 'CustRef' => $row['order_number'] );
额外提醒:SQL注入风险
你当前的查询语句直接拼接了$client和$row['platform_order_id'],这存在SQL注入的风险!建议改用预处理语句来避免这个问题,示例如下:
$Items = array(); // 准备预处理语句(只查询需要的字段,避免冗余) $stmt = $mysqli->prepare("SELECT sku, quantity, comments FROM order_items WHERE client_id = ? AND main_order_id = ?"); // 绑定参数(假设client和platform_order_id都是整数类型,用'i';如果是字符串类型用's') $stmt->bind_param("ii", $client, $row['platform_order_id']); // 执行查询 $stmt->execute(); // 获取结果集 $result2 = $stmt->get_result(); while($row2 = mysqli_fetch_assoc($result2)) { $Items[] = array( 'SKUNumber' => $row2['sku'], 'Quantity' => $row2['quantity'], 'Comments' => $row2['comments'] ); } // 关闭语句和结果集,释放资源 $stmt->close(); $result2->free();
这样处理后,你的$params['PickItems']就会正确包含所有从order_items表查询到的商品数据啦!
内容的提问来源于stack exchange,提问作者HippoDuck
相关产品推荐
相关产品推荐

