技术问询:合并两个数组表及获取网站已通过好友ID的实现问题
Hey there! Let's tackle your two questions one by one:
问题一:如何合并两个数组表?
合并数组的方法取决于你的具体需求(比如是索引数组还是关联数组,是否需要去重等),这里给你几种常用的PHP实现方式:
普通索引数组合并:用
array_merge()函数,它会把第二个数组的元素追加到第一个数组末尾,并且自动重新索引:$array1 = [1, 2, 3]; $array2 = [4, 5, 6]; $mergedArray = array_merge($array1, $array2); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 )关联数组合并:同样用
array_merge(),但如果两个数组存在相同的键,后一个数组的值会覆盖前一个的:$userInfo1 = ['name' => 'Bob', 'age' => 30]; $userInfo2 = ['age' => 31, 'city' => 'London']; $mergedInfo = array_merge($userInfo1, $userInfo2); // 输出:Array ( [name] => Bob [age] => 31 [city] => London )合并并去重:如果合并后需要去除重复元素,可以先合并再用
array_unique():$arrayA = [2, 4, 6]; $arrayB = [4, 6, 8]; $uniqueMerged = array_unique(array_merge($arrayA, $arrayB)); // 输出:Array ( [0] => 2 [1] => 4 [2] => 6 [5] => 8 )保留原索引的合并:用
+运算符,这种方式会保留第一个数组的键,相同键的元素只会保留第一个数组的:$arrayX = [0 => 'apple', 1 => 'banana']; $arrayY = [1 => 'cherry', 2 => 'date']; $mergedWithKeys = $arrayX + $arrayY; // 输出:Array ( [0] => apple [1] => banana [2] => date )
问题二:获取网站上的所有用户好友状态
先提个关键问题:你当前的代码存在SQL注入风险——直接把$id和$yes拼到SQL语句里,哪怕用了prepare(),这种写法也不安全。另外,你现在查的是所有字段,但其实只需要提取好友的ID,我们可以优化一下:
改进后的代码(安全且高效):
$currentUserId = $_SESSION['user_id']; $acceptedStatus = 1; // 假设accepted是整数类型,直接用整数更规范 // 用参数占位符避免SQL注入,同时只查询需要的好友ID $stmt = $db2->prepare(" SELECT CASE WHEN user1 = ? THEN user2 ELSE user1 END AS friend_id FROM friend_requests WHERE (user1 = ? OR user2 = ?) AND accepted = ? "); // 绑定参数并执行查询 $stmt->execute([$currentUserId, $currentUserId, $currentUserId, $acceptedStatus]); // 获取所有好友ID组成的数组 $friendIds = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
代码说明:
- SQL注入防护:用
?作为参数占位符,通过execute()传递参数,数据库会自动处理输入,避免恶意注入。 - 精准获取好友ID:用
CASE语句判断当前用户是user1还是user2,从而提取对应的好友ID(比如当前用户是发起请求的人,好友就是user2;如果是被添加的人,好友就是user1)。 - 性能优化:只查询需要的
friend_id字段,而不是SELECT *,减少数据传输和内存消耗。
如果需要获取好友的详细信息:
如果要拿到好友的用户名、头像等信息,可以和用户表做关联查询:
$stmt = $db2->prepare(" SELECT u.* FROM friend_requests fr JOIN users u ON (fr.user1 = ? AND u.id = fr.user2) OR (fr.user2 = ? AND u.id = fr.user1) WHERE fr.accepted = ? "); $stmt->execute([$currentUserId, $currentUserId, $acceptedStatus]); $friends = $stmt->fetchAll(PDO::FETCH_ASSOC);
这样就能得到所有已通过好友关系的用户详细数据啦。
内容的提问来源于stack exchange,提问作者shadow
相关产品推荐
相关产品推荐

