You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将一维数组中前缀相同的连续元素分组为关联数组

问题

现有一个动态一维数组,每个元素以特定编码开头(如"S10.G00.00"、"S10.G00.01"),数组示例如下:

array:20 [▼
  0 => "S10.G00.00.001,'www.mywebsite.com'"
  1 => "S10.G00.00.002,'Company name'"
  2 => "S10.G00.00.003,'v2.01'"
  3 => "S10.G00.01.001,'492484944'"
  4 => "S10.G00.01.002,'00029'"
  5 => "S10.G00.01.003,'First name'"
  6 => "S10.G00.01.004,'120 R CHARLES'"
  7 => "S10.G00.01.005,'92200'"
  8 => "S10.G00.02.001,'01'"
  9 => "S10.G00.02.002,'first name'"
  10 => "S10.G00.02.004,'email@gmail.com'"
  11 => "S10.G00.02.005,'0750000000'"
  12 => "S20.G00.05.001,'01'"
  13 => "S20.G00.05.002,'01'"
  14 => "S20.G00.05.003,'11'"
  15 => "S20.G00.05.004,'5'"
  16 => "S20.G00.05.010,'01'"
  17 => "S10.G00.01.001,'492484944'"
  18 => "S10.G00.01.002,'00029'"
  19 => "S10.G00.01.003,'Last name'"
]

需求:将数组中前缀(前10个字符)相同的连续元素分组,转换为如下结构的关联数组:

array:5 [▼
  0 => array:1 [▼
    "S10.G00.00" => array:3 [▼
      0 => "S10.G00.00.001,'www.mywebsite.com'"
      1 => "S10.G00.00.002,'Company name'"
      2 => "S10.G00.00.003,'v2.01'"
    ]
  ]
  1 => array:1 [▼
    "S10.G00.01" => array:5 [▼
      0 => "S10.G00.01.001,'492484944'"
      1 => "S10.G00.01.002,'00029'"
      2 => "S10.G00.01.003,'First name'"
      3 => "S10.G00.01.004,'120 R CHARLES'"
      4 => "S10.G00.01.005,'92200'"
    ]
  ]
  2 => array:1 [▼
    "S10.G00.02" => array:4 [▼
      0 => "S10.G00.02.001,'01'"
      1 => "S10.G00.02.002,'first name'"
      2 => "S10.G00.02.004,'email@gmail.com'"
      3 => "S10.G00.02.005,'0750000000'"
    ]
  ]
  3 => array:1 [▼
    "S20.G00.05" => array:5 [▼
      0 => "S20.G00.05.001,'01'"
      1 => "S20.G00.05.002,'01'"
      2 => "S20.G00.05.003,'11'"
      3 => "S20.G00.05.004,'5'"
      4 => "S20.G00.05.010,'01'"
    ]
  ]
  4 => array:1 [▼
    "S10.G00.01" => array:3 [▼
      0 => "S10.G00.01.001,'492484944'"
      1 => "S10.G00.01.002,'00029'"
      2 => "S10.G00.01.003,'Last name'"
    ]
  ]
]
解决方案

可以通过遍历数组并跟踪当前分组的前缀来实现连续元素的分组,以下是PHP实现代码:

$originalArray = [
    "S10.G00.00.001,'www.mywebsite.com'",
    "S10.G00.00.002,'Company name'",
    "S10.G00.00.003,'v2.01'",
    "S10.G00.01.001,'492484944'",
    "S10.G00.01.002,'00029'",
    "S10.G00.01.003,'First name'",
    "S10.G00.01.004,'120 R CHARLES'",
    "S10.G00.01.005,'92200'",
    "S10.G00.02.001,'01'",
    "S10.G00.02.002,'first name'",
    "S10.G00.02.004,'email@gmail.com'",
    "S10.G00.02.005,'0750000000'",
    "S20.G00.05.001,'01'",
    "S20.G00.05.002,'01'",
    "S20.G00.05.003,'11'",
    "S20.G00.05.004,'5'",
    "S20.G00.05.010,'01'",
    "S10.G00.01.001,'492484944'",
    "S10.G00.01.002,'00029'",
    "S10.G00.01.003,'Last name'",
];

$result = [];
$currentPrefix = null;
$currentGroup = [];

foreach ($originalArray as $item) {
    // 提取前10个字符作为前缀
    $prefix = substr($item, 0, 10);
    
    if ($prefix !== $currentPrefix) {
        // 前缀变化时,将当前组存入结果(如果组不为空)
        if (!empty($currentGroup)) {
            $result[] = [$currentPrefix => $currentGroup];
            $currentGroup = [];
        }
        $currentPrefix = $prefix;
    }
    
    // 将当前元素加入当前组
    $currentGroup[] = $item;
}

// 处理最后一组
if (!empty($currentGroup)) {
    $result[] = [$currentPrefix => $currentGroup];
}

// 输出结果
echo '<pre>';
print_r($result);
echo '</pre>';

代码逻辑说明

  1. 初始化结果数组、当前前缀变量和当前分组数组。
  2. 遍历原数组的每个元素,通过substr提取前10个字符作为分组前缀。
  3. 若当前元素的前缀与记录的前缀不同,则将之前的分组存入结果数组,同时重置当前分组和前缀。
  4. 将当前元素加入当前分组。
  5. 遍历结束后,把最后一个未存入结果的分组添加到结果数组中。

内容的提问来源于stack exchange,提问作者hous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:44:53