2009-08-07 7 views
2

sagen wir mal;Können PHP-Arrays das tun?

Ich habe einen Array $ Freunde mit 2.000 verschiedenen friendID Zahlen

+

Ich habe ein $ Bulletin Array mit 10.000 bulletinID Zahlen, wird das $ Bulletins Array hat auch eine anderen Wert mit einer Benutzer-ID von Wer hat den Bulletin-Eintrag veröffentlicht?

Jetzt ist es möglich, alle BulletinID-Nummern zu erhalten, die eine Benutzer-ID haben, die mit einer Benutzer-ID im Freundes-Array übereinstimmt? Und wenn es überhaupt möglich ist, wäre das schnell oder langsam oder nicht generell eine gute Methode? Ich versuche Bulletin-Posts auf meiner Website zu bekommen und zeige nur solche, die von einem Freund eines Users geposted werden, aber einige Benutzer haben ein paar tausend Freunde und Bulletins können Tausende sein, aber nur ein Teil von ihnen darf

ansehen

auch wenn dies möglich ist, könnte ich es begrenzen, wie die ersten 50 Bulletins IDs erhalten Oly, die eine friendID

Antwort

1

Ok, so dass es klingt wie Sie eine Reihe von Freund Ids haben, die nicht assoziativ ist, dh array(0 => 'userid0', 1 => 'userid1', etc), und eine Reihe von Bulletin-IDs, die assoziativ ist, dh. array('bulletin1' => 'userid1', 'bulletin2' => 'userid2', etc).

Mit dieser Annahme können Sie alle passenden Bulletins mit array_intersect() erhalten. Sie können dann die ersten fünfzig Bulletin Tasten nehmen mit array_slice():

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

Es klingt wie Sie diese Daten aus einer Datenbank jedoch könnten bekommen, in diesem Fall ist es viel vorsichtiger sein würde Ihre Datenbank Ergebnisse filtern irgendwie und Vermeiden Sie jedes Mal 10.000 IDs zurückzugeben. Sie können das Sortieren und Filtern mit JOIN s und WHERE s in den rechten Tabellen durchführen.

+0

danke, jeder hat wahrscheinlich recht mit der Verwendung der DB, um die Ergebnisse zu erhalten, aber ich bin das Friendlist-Array zwischenspeichern, so dass ich alle möglichen Möglichkeiten, es zu tun und denke, der beste Weg ist, jede Methode zu testen – JasonDavis

0

übereinstimmen wenn Sie ein bisschen von jedem Array schreiben würde (nicht alle 10.000 Artikel, würde die ersten 10 tun) Sie können mehr Bisse bekommen.

Überprüfen Sie in der Zwischenzeit array_search().

1

Ich gehe hier davon aus, dass Ihre $ Freunde-Array ist nur ein Array von Ints und jedes Element in Ihrem $bulletins ist ein Array mit userId und einige zusätzliche Felder.

Wenn Sie dieses Array auf 50 erste Datensätze beschränken möchten, fügen Sie einfach nur eine Bedingung in eine Schleife ein.

$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

Wo bekommen Sie diese Arrays von Tausenden von Freunden/Bulletins? Wenn die Antwort eine relationale Datenbank ist (MySQL, PostgreSQL), dann sollte dies mit einer SQL-Abfrage geschehen, da es ziemlich trivial ist und viel effizienter als alles, was Sie in PHP machen könnten.

Hier ist ein Beispiel dafür, wie dies in SQL getan werden könnte:

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; 

Offensichtlich ist es ohne Kenntnis Ihrer aktuellen Datenbank-Struktur durchgeführt, falls vorhanden, und wird daher nicht funktionieren wie sie ist, aber sollte dich auf den richtigen Weg bringen.

+0

Meine ersten Gedanken genau ... –

+0

Der Grund für den Blick auf andere Methoden ist, weil die Freunde-Array stammt aus einem Cache – JasonDavis

+0

Kommen die Bulletins auch aus einem Cache? – hobodave

Verwandte Themen