You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:47:34