2009-08-07 9 views
2

disons;Est-ce que les tableaux PHP peuvent faire cela?

J'ai un tableau d'amis $ avec 2000 numéros différents friendID

+

J'ai un tableau de bulletins de $ avec 10.000 numéros bulletinID, le tableau des bulletins de $ aura également une autre valeur avec un ID utilisateur de qui a publié l'entrée de bulletin

Maintenant, est-il possible d'obtenir tous les numéros de bulletinID qui ont un ID utilisateur correspondant à un ID utilisateur dans le tableau d'amis? Et si c'est possible, est-ce que ce serait rapide ou lent ou pas une bonne méthode? J'essaie d'obtenir des messages de type bulletin sur mon site et montrer seulement ceux postés par un ami d'un utilisateur mais certains utilisateurs ont quelques milliers d'amis et de bulletins pourraient être dans les milliers mais seulement certains d'entre eux un utilisateur est autorisé à voir

les 10 premiers aussi, si cela est possible, pourrais-je limiter à Oly obtenir comme les 50 premiers bulletins ID de qui correspondent à un friendID

Répondre

1

Ok, donc il semble que vous avez un tableau de ids ami qui n'est pas associative, à savoir array(0 => 'userid0', 1 => 'userid1', etc), et un tableau de bulletin ids est associative, par exemple. array('bulletin1' => 'userid1', 'bulletin2' => 'userid2', etc).

En partant de cette hypothèse, vous pouvez obtenir tous les bulletins correspondants en utilisant array_intersect(). Vous pouvez alors prendre les cinquante premières touches d'affichage avec array_slice():

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

On dirait que vous pourriez obtenir ces données sur une base de données mais, dans ce cas, il serait beaucoup plus prudent pour filtrer vos résultats de base de données en quelque sorte et évitez de renvoyer 10 000 identifiants à chaque fois. Vous pouvez faire le tri et le filtrage en utilisant JOIN s et WHERE s sur les bonnes tables.

+0

merci, tout le monde a probablement raison d'utiliser la base de données pour obtenir les résultats, mais je cache le tableau des listes d'amis, donc je regarde toutes les façons possibles de le faire et je pense que la meilleure façon est de tester chaque méthode – JasonDavis

0

Si vous postez un peu de chaque tableau (tous les 10.000 articles, ferait) vous pouvez obtenir plus de piqûres.

En attendant, consultez array_search().

1

Je suppose ici que votre tableau $ friends est juste un tableau d'ints et chaque élément de votre $bulletins est un tableau avec userId et quelques champs supplémentaires.

$len = count($bulletins); 
$matchedBulletins = array(); 
for ($i = 0; $i < $len; $i++) { 
    if (in_array($bulletins[$i]['userId'], $friends) { 
     $matchedBulletins[] = $bulletins[$i]; 
    } 
} 

Si vous ne voulez pas limiter ce tableau aux 50 premiers enregistrements, ajoutez simplement une condition à l'intérieur d'une boucle.

$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; 
     } 
    } 
} 
6

Où trouvez-vous ces tableaux de milliers d'amis/bulletins? Si la réponse est une base de données relationnelle (MySQL, PostgreSQL), alors cela devrait être fait en utilisant une requête SQL car elle est plutôt triviale, et beaucoup plus efficace que tout ce que vous pourriez faire en PHP.

Voici un exemple de la façon dont cela pourrait se faire dans 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; 

De toute évidence, il est fait sans connaissance de la structure de votre base de données réelle, le cas échéant, et donc ne fonctionnera pas comme-est, mais devrait vous mettre sur le bon chemin.

+0

Mes premières pensées exactement ... –

+0

La raison pour laquelle on regarde les autres méthodes est que le tableau des amis provient d'un cache – JasonDavis

+0

Est-ce que les bulletins proviennent également d'un cache? – hobodave

Questions connexes