PHP diziler bunu yapabilir mi?

4 Cevap php

Diyelim ki;

Ben 2.000 farklı FriendId numaraları ile $ arkadaş bir dizi var

+

Ben 10.000 bulletinID numaraları ile bir $ bültenleri dizi var, $ bültenler dizi de bülten yazısı gönderdi kim bir kullanıcı kimliği ile başka bir değere sahip olacaktır

Şimdi arkadaşlar dizide bir kullanıcı kimliği eşleşen bir kullanıcı kimliği olan tüm bulletinID numaralarını almak mümkün mü? Ve hatta mümkünse eğer, bu hızlı ya da yavaş ya da genellikle iyi bir yöntem olurdu? Ben sitemde bülten tip mesajları almak için çalışıyor ve yalnızca bir kullanıcının bir arkadaşı tarafından yayınlanan olanları göstermek ancak bazı kullanıcılar bin bir kaç arkadaş ve bültenler binlerce olabilir ama sadece bazıları bir kullanıcı görüntülemek için izin verilir am

Bu mümkün ise de, ben bir FriendId maç ilk 50 bültenlerinin kimlik numarası gibi almak oly için sınırlayabilir

4 Cevap

Tamam, bu yüzden, yani array(0 => 'userid0', 1 => 'userid1', etc) çağrışımlı değil arkadaşı kimlikleri bir dizi var gibi geliyor, ve bültenin bir dizi ki is ilişkisel, yani kimlikleri. array('bulletin1' => 'userid1', 'bulletin2' => 'userid2', etc).

Bu varsayıma ile gidip, array_intersect() kullanarak tüm eşleşen bültenleri alabilirsiniz. Daha sonra birlikte ilk elli bülten anahtarlarını almak array_slice() yapabilirsiniz:

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

Bu şekilde veritabanı sonuçları filtrelemek ve 10.000 IDS her zaman döndürülmesini engellemek için çok daha ihtiyatlı olacağını bu durumda, ancak bir veritabanı üzerinden bu verileri almak olabilir gibi geliyor. Sen sağ masalarda JOIN s ve WHERE s kullanarak sıralama ve filtreleme yapabilir.

Nereye arkadaş / bültenlerinin binlerce bu dizileri alıyorsanız? Cevabı bir ilişkisel veritabanı (MySQL, PostgreSQL) ise, o zaman bu oldukça önemsiz olduğu gibi bir SQL sorgusu kullanılarak yapılmalıdır, ve PHP yapabileceği şey çok daha verimli.

İşte bu SQL yapılabilir nasıl bir örnek:

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;

Açıkçası sizin gerçek veritabanı yapısı hiçbir bilgi ile yapılır, eğer varsa, ve bu nedenle gibi-isimli çalışmaz, ancak doğru yolda almalısınız.

Ben $ arkadaşlar dizi sadece ints bir dizi ve her öğe olduğunu burada varsayarak yaşıyorum sizin $bulletins userId ile bir dizi ve bazı ekstra alanlar değildir.

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

50 ilk kayıtlarını istiyorum bu dizi sınırlamak için wan't sadece sadece bir döngü içinde bir koşul ekleyin.

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

Her dizinin bir bit (hepsi değil 10,000 öğeleri, ilk 10 yapardın) yayınlamak isterseniz daha fazla sokması alabilirsiniz.

Bu arada array_search() göz atın.