PHP中如何循环实现城市数组的非自连有序配对输出?
实现通用城市有序配对的循环方案
你需要的是从城市数组中生成排除自匹配、保留方向的全排列配对:即任意两个不同城市,分别作为源和目标各生成一次配对,46个城市的总配对量为 46 * 45 = 2070 次,整体运算量非常低。
可直接复用的通用实现代码如下:
$villes = [ "Paris", "London", "Berlin", "Madrid", // 替换为实际业务中的46个城市数组即可 ]; $allPairs = []; // 遍历所有可作为起点的城市 foreach ($villes as $source) { // 遍历所有可作为终点的城市 foreach ($villes as $target) { // 跳过和起点相同的城市,避免无效自匹配 if ($source === $target) { continue; } // 此处直接接入你的距离计算逻辑即可 $allPairs[] = "\"{$source}\" -> \"{$target}\""; } } // 验证输出效果 print_r($allPairs);
性能优化思路
针对46个城市的规模,上述双重循环的执行耗时极低(通常在1ms以内),完全不需要担心性能瓶颈。如果后续城市规模持续增长,可参考以下优化方向:
- 替换循环内的相等判断逻辑:提前执行
$cityIndexMap = array_flip($villes)生成「城市名 => 数组下标」的映射,双重循环改为遍历下标,判断自匹配时直接比较整型下标,比字符串比较效率提升30%以上 - 把循环外不变的逻辑前置:比如距离计算用到的常量(如地球平均半径、经纬度转换的公共参数),不要写在循环内部,提到循环外全局定义,避免重复初始化的开销
- 固定配对结果缓存:如果城市列表不会频繁变动,可把生成好的配对结果一次性序列化存储,后续业务直接读取缓存,不需要重复执行循环生成逻辑
注:该方案生成的配对和你给出的示例格式完全匹配,既不会漏配不同城市间的双向关联,也不会出现城市自匹配的无效配对。
内容的提问来源于stack exchange,提问作者MaximeCgn
相关产品推荐
相关产品推荐

