如何基于mysqli查询结果创建拆分型数组(Zen Cart环境)
解决方案:拆分订单查询结果为多维数组
你提到的“拆分为两部分的数组”,其实用多维关联数组来实现是最合理的——毕竟订单和商品是一对多的关系,我们可以把订单的基础信息单独存为一个子数组,把所有商品明细存为另一个子数组,这样结构清晰,也符合Zen Cart的开发逻辑。
结合你的代码,我给你整理了完整的实现方案:
完整代码示例
$oID = (int)$oID; // 补全查询条件,确保只获取目标订单的数据(避免返回所有订单) $combined = $db->execute(" SELECT op.orders_id, op.products_model, op.products_name, op.products_quantity, o.customers_name FROM " . TABLE_ORDERS_PRODUCTS . " op LEFT JOIN " . TABLE_ORDERS . " o ON op.orders_id = o.orders_id WHERE op.orders_id = " . (int)$oID "); // 初始化拆分后的多维数组:包含订单信息和商品明细两个部分 $splitOrderData = [ 'order_basic_info' => [], // 存储订单的核心信息(仅一份) 'order_product_list' => [] // 存储该订单下的所有商品(多条) ]; if (!$combined->EOF) { // 提取订单基础信息(因为所有商品行的订单信息重复,取第一行即可) $splitOrderData['order_basic_info'] = [ 'orders_id' => $combined->fields['orders_id'], 'customers_name' => $combined->fields['customers_name'] ]; // 遍历所有商品行,填充商品明细数组 do { $splitOrderData['order_product_list'][] = [ 'products_model' => $combined->fields['products_model'], 'products_name' => $combined->fields['products_name'], 'products_quantity' => $combined->fields['products_quantity'] ]; } while (!$combined->EOF); }
代码说明
- 数组结构解析:
$splitOrderData是一个多维数组,包含两个子数组:order_basic_info:只存储一次订单的核心数据(订单ID、客户名),避免重复存储冗余信息order_product_list:是一个索引数组,每个元素都是单个商品的关联数组,存储商品的型号、名称、购买数量
- 遍历逻辑:
- Zen Cart的
$db->execute()返回ADODB结果集对象,用do-while循环可以完整遍历所有查询行(包括第一行) - 因为订单和商品是一对多关系,查询结果里每一行商品都会附带重复的订单信息,所以我们只需要提取一次订单基础信息即可
- Zen Cart的
可选:拆分为完全独立的两个数组
如果你更倾向于用两个完全独立的数组来存储,逻辑是一样的,代码调整如下:
$oID = (int)$oID; $combined = $db->execute(" SELECT op.orders_id, op.products_model, op.products_name, op.products_quantity, o.customers_name FROM " . TABLE_ORDERS_PRODUCTS . " op LEFT JOIN " . TABLE_ORDERS . " o ON op.orders_id = o.orders_id WHERE op.orders_id = " . (int)$oID "); $orderInfo = []; $productsList = []; if (!$combined->EOF) { $orderInfo = [ 'orders_id' => $combined->fields['orders_id'], 'customers_name' => $combined->fields['customers_name'] ]; do { $productsList[] = [ 'products_model' => $combined->fields['products_model'], 'products_name' => $combined->fields['products_name'], 'products_quantity' => $combined->fields['products_quantity'] ]; } while (!$combined->EOF); }
这样你就可以根据需求,灵活使用拆分后的数组数据了。
内容的提问来源于stack exchange,提问作者Steph3071
相关产品推荐
相关产品推荐

