Nasıl ortak bir anahtar üzerinde PHP tabanlı iki dizileri birleştirmek mi?

4 Cevap php

Ben birlikte bir entry_id anahtarına dayalı iki ilişkilendirilebilir diziler katılmaya çalışıyorum. Hem diziler aşağıdaki gibi anahtar => değer çiftleri tek tek veritabanı kaynakları, ilk mağazalar girdi başlıkları, ikinci mağaza giriş yazarlar, gelen:

array (
    'entry_id' => 1,
    'title' => 'Test Entry'
)   

array (
    'entry_id' => 1,
    'author_id' => 2

Ben gibi bir dizi yapısı elde etmek için çalışıyorum:

array (
    'entry_id' => 1,
    'author_id' => 2,
    'title' => 'Test Entry'
)

Şu anda, her dizi döngü ve dizinin istediğim şekilde biçimlendirerek sorunu çözdük, ama bu bir bellek domuz bir parça olduğunu düşünüyorum.

$entriesArray = array();
foreach ($entryNames as $names) {
    foreach ($entryAuthors as $authors) {
        if ($names['entry_id'] === $authors['entry_id']) {
            $entriesArray[] = array(
                'id' => $names['entry_id'],
                'title' => $names['title'],
                'author_id' => $authors['author_id']
            );                          
        }
    }
}

Ben bunu bir daha kolay, daha az bellek yoğun yöntem var olduğunu bilmek istiyorum?

4 Cevap

Ben benzeyen tek bir SQL sorgusu için izin kodumu bazıları yeniden düzenlenmiş ettik:

$sql = sprintf('SELECT DISTINCT wd.field_id_5, wd.entry_id, mb.email, mb.screen_name 
            FROM `exp_weblog_data` wd
            INNER JOIN `exp_weblog_titles` wt
            ON wt.entry_id=wd.entry_id
            INNER JOIN `exp_members` mb
            ON mb.member_id=wt.author_id
            WHERE mb.member_id IN ("%s")
            AND wd.entry_id IN ("%s")',
            join('","', array_unique($authors)),
            join('","', array_unique($ids))
);

Bu başka bir SQL çağrı yapıyorum rağmen, oldukça güzel benim sorunu çözer. Çalıştığınız için teşekkürler.

Bunu yapabileceğiniz olası bir veritabanından bilgi almak yerine çoklu sorgularda veri getiriliyor için kullanılan SQL JOIN? Bu çok daha hızlı ve kıvrımlara veritabanı düzeyinde bunu yapmak olacaktır.

Veritabanı yapısına bağlı olarak benzer bir şey kullanmak isteyebilirsiniz

SELECT entry_id, title, author_id
FROM exp_weblog_data
INNER JOIN exp_weblog_titles
ON exp_weblog_data.entry_id = exp_weblog_titles.entry_id
WHERE field_id_53 = "%s" AND WHERE entry_id IN ("%s")

Wikipedia has a bit on each type of join

Bu başlık entry_id bir harita, böylece aksi takdirde iyi seçenek İlk dizi yeniden olabilir

Yani:

array(
    array(
       'entry_id' => 1,
       'title' => 'Test Entry 1',
    ),
    array(
       'entry_id' => 3,
       'title' => 'Test Entry 2',
    ),
)

Olacak:

array(
    1 => 'Test Entry 1',
    3 => 'Test Entry 2',
)

Diziler birleştirmek için gerekli kodu bu basitleştirilmiş olduğu anlamına gelecektir ki:

$entriesArray = array();
foreach ($entryAuthors as $authors) {
    $entriesArray[] = array(
        'id' => $authors['entry_id'],
        'title' => $entryNames[$authors['entry_id']],
        'author_id' => $authors['author_id']
    );                           
}

Yacoby adlı yayında Yorumlarınız yanıt olarak, bu SQL sonra olan çıkış vermez?

SELECT exp_weblog_data.entry_id, exp_weblog_data.field_id_5 AS title_ie, exp_weblog_titles.author_id 
FROM exp_weblog_data LEFT JOIN exp_weblog_titles 
ON exp_weblog_data.entry_id = exp_weblog_titles.entry_id 
WHERE exp_weblog_data.field_id_53 = "%S"

Bir giriş birden fazla yazar varsa field_id_53 = "% S", exp_weblog_titles herhangi eşleşen yazarlar katıldı olacak exp_weblog_data her giriş, iki veya daha fazla satır iade edilecektir.