PHP多维数组按u、v、w键分组合并其余键值
PHP多维数组按指定键合并相同元素的其余键值
需求说明
当多维数组中元素的u、v、w键值完全相同时,合并其余键(x、y、z)的取值,用逗号分隔。
示例输入数组
$myarray = array ( '0' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '30', 'y' => '16', 'z' => '22', ), '1' => array ( 'u' => '32', 'v' => '25', 'w' => '1', 'x' => '30', 'y' => '16', 'z' => '22', ), '2' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '54', 'y' => '96', 'z' => '2', ), '3' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '3', 'y' => '1', 'z' => '6', ) );
期望输出数组
// OUTPUT array ( '0' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '30,54,3', 'y' => '16,96,1', 'z' => '22,2,6', ), '1' => array ( 'u' => '32', 'v' => '25', 'w' => '1', 'x' => '30', 'y' => '16', 'z' => '22', ) )
原代码问题分析
用户的尝试代码存在两个核心问题:
- 仅对比输出数组的最后一个元素,无法处理非连续出现的相同
u/v/w组合元素; - 使用
$output += $row的方式错误,这只会用新数组的键覆盖已有键,而非合并对应的值。
正确实现方法
通过构建唯一分组键的方式来处理:将每个元素的u、v、w值拼接成字符串作为临时数组的键,以此区分不同分组。遍历原数组时,将相同分组的x、y、z值逐步拼接,最后将临时数组转为普通索引数组即可。
<?php $myarray = array ( '0' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '30', 'y' => '16', 'z' => '22', ), '1' => array ( 'u' => '32', 'v' => '25', 'w' => '1', 'x' => '30', 'y' => '16', 'z' => '22', ), '2' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '54', 'y' => '96', 'z' => '2', ), '3' => array ( 'u' => '30', 'v' => '16', 'w' => '22', 'x' => '3', 'y' => '1', 'z' => '6', ) ); $temp = []; foreach ($myarray as $item) { // 生成唯一分组标识键 $groupKey = $item['u'] . '-' . $item['v'] . '-' . $item['w']; if (!isset($temp[$groupKey])) { // 首次遇到该分组,直接初始化 $temp[$groupKey] = $item; } else { // 已有该分组,合并x/y/z的值 $temp[$groupKey]['x'] .= ',' . $item['x']; $temp[$groupKey]['y'] .= ',' . $item['y']; $temp[$groupKey]['z'] .= ',' . $item['z']; } } // 将临时分组数组转为索引数组,得到最终结果 $output = array_values($temp); // 打印验证结果 print_r($output); ?>
运行上述代码后,输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者Dslide
相关产品推荐
相关产品推荐

