PHP如何将数组元素按首字母分组得到指定的键值结构?
问题原因
你使用array_map的逻辑是对每个输入元素单独返回一个一维数组,该函数只会将回调的返回值和原数组索引一一对应返回,不会自动合并相同键的元素,因此得到了嵌套的二维数组,和预期结果不符。
调整方案
推荐直接遍历原数组实现分组,逻辑更直观、性能更好,实现代码如下:
$a = ['abc','cde','frtg','acf']; $b = []; foreach ($a as $str) { // 提取首字母 $firstChar = substr($str, 0, 1); // 对应首字母分组不存在则初始化 if (!isset($b[$firstChar])) { $b[$firstChar] = []; } // 将当前单词加入对应分组 $b[$firstChar][] = $str; } // 将每个分组的数组转为逗号分隔的字符串 $b = array_map(fn($item) => implode(',', $item), $b); print_r($b);
运行后输出和你的预期完全一致:
Array ( [a] => abc,acf [c] => cde [f] => frtg )
如果你一定要基于原有代码的输出结果调整,可以补充合并逻辑,不过会多一次遍历,效率低于上述方案:
// 原有代码得到的$b function alpha($str) { $result[substr($str,0,1)] = $str; return $result; } $a = ['abc','cde','frtg','acf']; $b = array_map('alpha', $a); // 补充合并逻辑 $final = []; foreach ($b as $item) { foreach ($item as $key => $val) { $final[$key] = isset($final[$key]) ? $final[$key].','.$val : $val; } } print_r($final);
内容的提问来源于stack exchange,提问作者wav
相关产品推荐
相关产品推荐

