PHP数组操作问题:如何推入唯一元素及评论点赞数组重复修复
我来帮你解决这两个问题,先从你的代码问题说起:
一、修复评论点赞数据重复的问题
你的核心问题出在**$LikesCommentUserId数组没有在每次处理单个评论时重置**。这个变量在循环外没有被初始化,导致每次处理新评论时,都会把之前所有评论的点赞用户数据继续追加进去,最终造成后面的评论包含了前面所有评论的点赞数据。
修复后的代码:
$stmt = $pdo->prepare("SELECT * FROM comments WHERE post_id = ? ORDER BY comment_id DESC"); $stmt->execute(array($findCommentById)); $comments_list = array(); while($rows = $stmt->fetch()){ $temp = array(); $temp['comment_id'] = $rows['comment_id']; $temp['user_name'] = $rows['user_name']; // 关键:每次处理新评论时,初始化一个空数组,避免数据累积 $LikesCommentUserId = array(); $selectLikedCommentUser = $pdo->prepare("SELECT user_id FROM commentLikes WHERE comment_id = ?"); $selectLikedCommentUser->execute(array($rows['comment_id'])); while($commentLikesRows = $selectLikedCommentUser->fetch()){ $LikesCommentUserId[] = array("LikesCommentUserId"=>$commentLikesRows['user_id']); } $temp['CommentLikesByUser'] = $LikesCommentUserId; array_push($comments_list, $temp); } echo json_encode(array("commentList"=>$comments_list));
额外性能优化建议:
你当前的写法属于「N+1查询」(查1次评论,再查N次点赞数据),当评论数量较多时会影响数据库性能。推荐用LEFT JOIN一次性查询所有数据:
$stmt = $pdo->prepare(" SELECT c.*, GROUP_CONCAT(cl.user_id) AS liked_user_ids FROM comments c LEFT JOIN commentLikes cl ON c.comment_id = cl.comment_id WHERE c.post_id = ? GROUP BY c.comment_id ORDER BY c.comment_id DESC "); $stmt->execute(array($findCommentById)); $comments_list = array(); while($rows = $stmt->fetch()){ $temp = array(); $temp['comment_id'] = $rows['comment_id']; $temp['user_name'] = $rows['user_name']; // 处理点赞用户ID,转换为你需要的格式 $likedUserIds = $rows['liked_user_ids'] ? explode(',', $rows['liked_user_ids']) : array(); $LikesCommentUserId = array_map(function($id){ return array("LikesCommentUserId" => $id); }, $likedUserIds); $temp['CommentLikesByUser'] = $LikesCommentUserId; array_push($comments_list, $temp); } echo json_encode(array("commentList"=>$comments_list));
这样只需要1次数据库查询,效率会提升很多。
二、PHP中推入唯一数组元素的方法
常用的实现方式有3种,根据你的场景选择:
方法1:先检查再推入(适合小数组)
$array = [1, 2, 3]; $newElement = 3; // 检查元素是否存在,不存在则推入 if(!in_array($newElement, $array)){ $array[] = $newElement; }如果是关联数组,可用
array_key_exists()检查键是否唯一。方法2:利用数组键的唯一性(适合大数据量)
数组的键是天然唯一的,可把元素作为键存储,最后再还原为值数组:$array = [1, 2, 3]; $newElement = 3; $array[$newElement] = true; // 重复元素会自动覆盖 $array = array_keys($array); // 还原为原始值数组这种方法比
in_array()效率更高,因为键查找是O(1)时间复杂度。方法3:先推入再去重(简单粗暴)
$array = [1, 2, 3]; $newElement = 3; $array[] = $newElement; $array = array_unique($array); // 去重缺点是大数据量下性能较差,因为
array_unique()需要遍历整个数组。
内容的提问来源于stack exchange,提问作者Sharik ansari
相关产品推荐
相关产品推荐

