2010-03-22 97 views
4

我試圖根據entry_id鍵將兩個關聯陣列連接在一起。兩個陣列來自個人數據庫資源,所述第一存儲項的標題,所述第二存儲項的作者,密鑰=>值對如下:如何在基於普通密鑰的PHP中組合兩個數組?

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

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

我試圖實現陣列結構等:

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

目前,我已經通過循環遍歷每個數組並按照我想要的方式格式化陣列來解決該問題,但我認爲這是一個內存宏。

$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'] 
      );       
     } 
    } 
} 

我想知道是否有一個更簡單,更少的內存密集型方法呢?

回答

1

我重新安排我的一些代碼,允許單個SQL查詢,看起來像:

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

這解決我的問題相當不錯,儘管我在做另一個SQL調用。感謝您的嘗試。

2

是否有可能在用於從數據庫檢索信息的SQL中執行JOIN,而不是在多個查詢中獲取數據?在數據庫級別做這件事速度會快得多。

根據您的數據庫結構,你可能需要使用類似的東西來

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

否則最好的選擇可能是重組的第一陣列,它是entry_id的地圖來標題

所以:

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

將成爲:

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

這意味着合併陣列需要被簡化到這個代碼:

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

其表達式引擎網站,所以我不能完全肯定,我的SQL查詢: SELECT entry_id,field_id_5 AS title_ie FROM exp_weblog_data WHERE field_id_53 = 「%s的」 和: SELECT entry_id,標題, author_id FROM exp_weblog_titles WHERE entry_id IN(「%s」) 每個查詢都有一個獨特的WHERE子句,我的SQL知識是有限的,我可以將兩個查詢合併爲一個嗎? – 2010-03-22 13:17:51

+1

-1您確定多少「在數據庫級別執行該操作會快得多並且更加簡單。」您是否認爲連接到數據庫,連接兩個或更多表並返回結果會更慢。我強烈建議您閱讀「MySQL高性能」一書,以掌握數據庫和索引。在應用程序級聯接兩個表的速度更快,除此之外,MySQL更快地獲取結果的機會更大,因爲每個查詢都將通過其快速的PRIMARY KEY獲取。如果你想將它緩存在Web應用程序上,它會更理想。 – ALH 2012-07-21 17:57:44

-1
+0

如果您閱讀了這個問題,就會發現這不是我們想要的。我認爲所示的示例數組是大數組中的單個元素。 – Yacoby 2010-03-22 13:13:04

+0

array_merge只會將第二個數組追加到第一個數組中,我想通過'entry_id'將它們連接起來,這是兩個數組中的唯一鍵 – 2010-03-22 14:05:13

+0

抱歉,我的錯 – Tobias 2010-03-22 15:29:09

0

在迴應Yacoby的文章發表的留言,將在SQL不給你後的輸出?

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" 

在exp_weblog_data每一個條目,其中field_id_53 =「%S」將在exp_weblog_titles任何匹配的作者被加入,如果某個條目下有一個以上的作者,兩列以上將被退回。