【问题标题】:Can PHP arrays do this?PHP数组可以做到这一点吗?
【发布时间】:2009-08-07 05:28:51
【问题描述】:

让我们说;

我有一个包含 2,000 个不同朋友 ID 号的 $friends 数组

+

我有一个包含 10,000 个公告 ID 编号的 $bulletins 数组,$bulletins 数组还有另一个值,其中包含发布公告条目的用户 ID

现在是否可以获取所有具有与朋友数组中的用户ID 匹配的用户ID 的公告ID 编号?如果有可能,这会是快还是慢,或者通常不是一个好方法?我正在尝试在我的网站上获取公告类型的帖子,并且只显示用户的朋友发布的帖子,但有些用户有几千个朋友,公告可能有数千个,但只有其中一些用户被允许查看

另外,如果可能的话,我是否可以将其限制为仅获取与朋友 ID 匹配的前 50 个公告 ID

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您从哪里获得这些包含数千个朋友/公告的数组?如果答案是关系数据库(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;
    

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

    【讨论】:

    • 之所以看其他方法是因为friends数组来自缓存
    • 公告也来自缓存吗?
    • 如果这是一个 SQL 支持的应用程序,缓存仍然无关紧要。当你不需要时,你会通过迭代数千个元素来扼杀你的表现。这仍然可以使用 SQL 查询来检索。
    【解决方案2】:

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

    按照这个假设,您可以使用array_intersect() 获得所有匹配的公告。然后您可以使用array_slice() 获取前五十个公告键:

    $matchingBulletins = array_intersect($bulletins, $friends);
    $first50 = array_slice(array_keys($matchingBulletins),0,50);
    

    听起来您可能会从数据库中获取这些数据,但在这种情况下,以某种方式过滤您的数据库结果并避免每次返回 10,000 个 id 会更加谨慎。您可以使用右侧表格上的JOINs 和WHEREs 进行排序和过滤。

    【讨论】:

    • 谢谢,使用数据库获取结果的每个人都可能是对的,但我正在缓存好友列表数组,所以我正在寻找所有可能的方法,我认为最好的方法是测试每个方法
    【解决方案3】:

    我在这里假设您的 $friends 数组只是一个整数数组,而您的 $bulletins 中的每个项目都是一个包含 userId 和一些额外字段的数组。

    $len = count($bulletins);
    $matchedBulletins = array();
    for ($i = 0; $i < $len; $i++) {
        if (in_array($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;
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果您发布每个数组的一些内容(不是全部 10,000 个项目,前 10 个可以),您可能会得到更多的咬。

      同时查看array_search()

      【讨论】:

        猜你喜欢
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多