Могут ли массивы PHP сделать это? - PullRequest
2 голосов
/ 07 августа 2009

допустим;

У меня есть массив $ friends с 2000 различными номерами friendID

+

У меня есть массив $ bulletins с 10000 номеров bulletinID, массив $ bulletins также будет иметь другое значение с userID того, кто опубликовал запись в бюллетене

Теперь можно ли получить все номера бюллетеней с идентификатором пользователя, совпадающим с идентификатором пользователя в массиве друзей? И если это вообще возможно, будет ли это быстрым или медленным или вообще не будет хорошим методом? Я пытаюсь размещать сообщения типа бюллетеня на своем сайте и показывать только сообщения, опубликованные другом пользователя, но у некоторых пользователей есть несколько тысяч друзей, а бюллетени могут быть тысячами, но только некоторые из них пользователь может просматривать

Кроме того, если это возможно, могу ли я ограничить его только получением первых 50 идентификаторов бюллетеней, которые соответствуют идентификатору друга

Ответы [ 4 ]

6 голосов
/ 07 августа 2009

Где вы получаете эти массивы тысяч друзей / бюллетеней? Если ответом является реляционная база данных (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;

Очевидно, что это делается без знания вашей реальной структуры базы данных, если таковая имеется, и, следовательно, не будет работать как есть, но должно привести вас на правильный путь.

1 голос
/ 07 августа 2009

Хорошо, похоже, у вас есть массив идентификаторов друзей, который не является ассоциативным, то есть array(0 => 'userid0', 1 => 'userid1', etc), и массив идентификаторов бюллетеней, который является ассоциативным, т.е. array('bulletin1' => 'userid1', 'bulletin2' => 'userid2', etc).

Исходя из этого предположения, вы можете получить все соответствующие бюллетени, используя array_intersect () . Затем вы можете взять первые пятьдесят бюллетеней с помощью array_slice () :

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

Звучит так, как будто вы, возможно, получаете эти данные из базы данных, и в этом случае было бы гораздо разумнее как-то отфильтровать результаты вашей базы данных и не возвращать 10000 идентификаторов каждый раз. Вы можете выполнить сортировку и фильтрацию, используя JOIN s и WHERE s в соответствующих таблицах.

1 голос
/ 07 августа 2009

Я предполагаю, что ваш массив $ 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;
        }
    }
}
0 голосов
/ 07 августа 2009

Если вы разместите немного каждого массива (не все 10000 элементов, первые 10 будут делать), вы можете получить больше укусов.

Проверьте array_search().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...