PHP数组实现Pickup与后续所有Delivery的索引组合方案问询
正确实现Pickup与后续Delivery的索引组合
问题核心
你需要每个Pickup仅和它之后出现的所有Delivery生成索引/位置组合,但之前的方法是将所有Pickup与所有Delivery做全量笛卡尔积,导致出现Pickup和它之前的Delivery错误配对的情况。
解决方案思路
- 先遍历原数组,记录所有Pickup和Delivery的索引及对应位置信息
- 对每个Pickup,只筛选出索引大于它的Delivery进行配对
- 收集所有符合顺序要求的组合
代码实现
public function getPickupDeliveryCombinations($stops) { $pickupList = []; $deliveryList = []; // 收集所有Pickup和Delivery的索引与位置信息 foreach ($stops as $index => $stop) { foreach ($stop['location_stop_actions'] as $stopAction) { $actionName = $stopAction['stop_action_name']; if ($actionName === 'Pickup') { $pickupList[] = [ 'index' => $index, 'location' => $stop['load_location_name'] ]; } elseif ($actionName === 'Delivery') { $deliveryList[] = [ 'index' => $index, 'location' => $stop['load_location_name'] ]; } } } $validCombinations = []; // 遍历每个Pickup,匹配之后的所有Delivery foreach ($pickupList as $pickup) { $pickupIndex = $pickup['index']; foreach ($deliveryList as $delivery) { if ($delivery['index'] > $pickupIndex) { // 如果需要位置名称组合,用下面这行 $validCombinations[] = [$pickup['location'], $delivery['location']]; // 如果需要纯索引字符串(比如示例的"0-1"),替换为: // $validCombinations[] = $pickupIndex . '-' . $delivery['index']; } } } return $validCombinations; }
代码说明
- 先遍历数组时同时记录索引和位置信息,既保证顺序判断的依据,也保留你需要的位置名称
- 通过
$delivery['index'] > $pickupIndex的判断,严格确保Delivery出现在Pickup之后,从根源避免错误配对 - 可以根据需求切换返回格式:是位置名称数组,还是纯索引字符串
原方法出错原因
你之前的combinations函数是生成两个数组的全量笛卡尔积,完全忽略了原数组中Pickup和Delivery的先后顺序,所以会出现Pickup和它之前的Delivery配对的错误情况。
内容的提问来源于stack exchange,提问作者Ravinder singh
相关产品推荐
相关产品推荐

