PHP数组可以做到这一点吗?

PHP数组可以做到这一点吗?,php,arrays,Php,Arrays,让我们说 我有一个$friends数组,其中包含2000个不同的friendID号 + 我有一个$bulletins数组,其中有10000个bulletinID号,$bulletins数组还将有另一个值,其用户ID为发布公告条目的用户 现在可以在friends数组中获取所有bulletinID号中的用户ID与用户ID匹配吗?如果可能的话,这是快还是慢,或者通常不是一个好方法?我试图在我的网站上获得公告类型的帖子,只显示用户朋友发布的帖子,但有些用户有几千个朋友,公告可能有几千个,但用户只能查看其

让我们说

我有一个$friends数组,其中包含2000个不同的friendID号

+

我有一个$bulletins数组,其中有10000个bulletinID号,$bulletins数组还将有另一个值,其用户ID为发布公告条目的用户

现在可以在friends数组中获取所有bulletinID号中的用户ID与用户ID匹配吗?如果可能的话,这是快还是慢,或者通常不是一个好方法?我试图在我的网站上获得公告类型的帖子,只显示用户朋友发布的帖子,但有些用户有几千个朋友,公告可能有几千个,但用户只能查看其中的一些


此外,如果这是可能的,我是否可以将其限制为oly获得与friendID匹配的前50个bulletins ID

如果您在每个数组中发布一点(并非所有10000个项目,前10个项目都可以),您可能会获得更多的比特


同时,请查看
array\u search()

我在这里假设$friends数组只是一个int数组,而
$bulletins
中的每个项目都是一个带有
用户ID
和一些额外字段的数组

$len = count($bulletins);
$matchedBulletins = array();
for ($i = 0; $i < $len; $i++) {
    if (in_array($bulletins[$i]['userId'], $friends) {
        $matchedBulletins[] = $bulletins[$i];
    }
}
$len=count($bulletins);
$matchedBulletins=array();
对于($i=0;$i<$len;$i++){
if(在数组中($bulletins[$i]['userId',$friends){
$matchedBulletins[]=$bulletins[$i];
}
}
如果不想将此数组限制为仅50条第一记录,只需在循环中添加一个条件

$len = count($bulletins);
$matchedBulletins = array();
$bulletinsCount = 0;
for ($i = 0; $i < $len; $i++) {
    if (in_array($bulletins[$i]['userId'], $friends) {
        $matchedBulletins[] = $bulletins[$i];
        $bulletinsCount++
        if ($bulletinsCount == 50) {
            break;
        }
    }
}
$len=count($bulletins);
$matchedBulletins=array();
$bulletinsCount=0;
对于($i=0;$i<$len;$i++){
if(在数组中($bulletins[$i]['userId',$friends){
$matchedBulletins[]=$bulletins[$i];
$bulletinsCount++
如果($bulletinsCount==50){
打破
}
}
}

你从哪里得到这些数千个好友/公告的数组?如果答案是关系数据库(MySQL、PostgreSQL),那么这应该使用SQL查询来完成,因为它非常简单,而且比PHP中的任何查询都要高效

下面是一个如何在SQL中执行此操作的示例:

SELECT
  posts.id
FROM posts
JOIN users ON posts.user_id = users.id
JOIN user_friends ON user_friends.user_id = users.id
WHERE posts.type = 'bulletin'
AND user_friends.user_id = 7
LIMIT 50;

显然,它是在不了解您的实际数据库结构(如果有的话)的情况下完成的,因此不会按原样工作,但会让您走上正确的道路。

好的,所以听起来您有一个非关联的朋友ID数组,即
数组(0=>'userid0',1=>'userid1',等等)
,以及一个关联的公告ID数组,即
数组('bulletin1'=>'userid1','bulletin2'=>'userid2'等)

根据该假设,您可以使用获取所有匹配的公告。然后,您可以使用以下工具获取前50个公告键:


听起来您可能正在从数据库中获取这些数据,但是,在这种情况下,以某种方式筛选数据库结果会更加谨慎,并避免每次返回10000个ID。您可以使用右表中的
JOIN
s和
WHERE
s进行排序和筛选。

谢谢,每个人都可能是right关于使用DB获得结果,但我正在缓存friendlist数组,因此我正在研究所有可能的方法,我认为最好的方法是测试每种方法查看其他方法的原因是因为friends数组来自缓存bulletins也来自缓存吗?如果这是SQ,缓存仍然不相关L支持的应用程序。在不需要的情况下,通过对数千个元素进行迭代会降低性能。这仍然可以使用SQL查询进行检索。
$matchingBulletins = array_intersect($bulletins, $friends);
$first50 = array_slice(array_keys($matchingBulletins),0,50);