将一维数组中前缀相同的连续元素分组为关联数组
问题
现有一个动态一维数组,每个元素以特定编码开头(如"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>';
代码逻辑说明
- 初始化结果数组、当前前缀变量和当前分组数组。
- 遍历原数组的每个元素,通过
substr提取前10个字符作为分组前缀。 - 若当前元素的前缀与记录的前缀不同,则将之前的分组存入结果数组,同时重置当前分组和前缀。
- 将当前元素加入当前分组。
- 遍历结束后,把最后一个未存入结果的分组添加到结果数组中。
内容的提问来源于stack exchange,提问作者hous
相关产品推荐
相关产品推荐

