PHP:基于相同值类型创建子数组,合并用户爱好遇问题
问题排查与解决方案
嗨,我来帮你梳理下代码里的问题,以及给出更靠谱的实现方式~
你的代码存在两个核心问题:
数组越界错误
你的循环条件用了$x <= count($majorArray),但数组的索引是从1开始(看你的示例数组),当$x等于数组长度(示例里是2)时,$majorArray[$x+1]就会访问一个不存在的索引(3),这会直接导致报错,或者返回null,使得你的相等判断失效。逻辑覆盖不全
你只比较当前元素和下一个元素的邮箱,就算相邻元素匹配,也只能把当前的hobby推入数组,会漏掉最后一个相同用户的hobby(比如示例里的hiking就不会被收集到);如果未来你的数组里相同用户的条目不是连续排列的,这种逻辑完全处理不了。
正确的实现方式
我们可以用邮箱作为唯一标识,遍历数组时合并同一个用户的所有爱好,同时保留用户的其他信息:
$mergedUsers = []; foreach ($majorArray as $userItem) { $email = $userItem['email']; // 第一次遇到该邮箱时,初始化用户基础信息和空的爱好数组 if (!isset($mergedUsers[$email])) { $mergedUsers[$email] = [ 'fname' => $userItem['fname'], 'lname' => $userItem['lname'], 'id' => $userItem['id'], 'email' => $email, 'hobbies' => [] ]; } // 将当前爱好添加到对应用户的爱好数组中 $mergedUsers[$email]['hobbies'][] = $userItem['hobby']; } // 如果需要把结果转为数字索引的数组(去掉邮箱作为键) $mergedUsers = array_values($mergedUsers); // 输出结果 print_r($mergedUsers);
运行结果(针对你的示例数组)
这段代码会输出:
Array ( [0] => Array ( [fname] => Eli [lname] => Solo [id] => 1 [email] => elis@elis.com [hobbies] => Array ( [0] => plants [1] => hiking ) ) )
这种方式不管用户条目是否连续,都能准确合并所有爱好,也不会出现数组越界的问题~
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

