2010-03-22 5 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

Возможно ли, что вы можете сделать JOIN в SQL, используемом для извлечения информации из базы данных, а не для сбора данных в нескольких запросах? Было бы намного быстрее и аккуратнее сделать это на уровне базы данных.

В зависимости от структуры базы данных вы можете использовать что-то похожее на

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 запросы: ВЫБРАТЬ entry_id, field_id_5 КАК title_ie ОТ exp_weblog_data ГДЕ field_id_53 = "% S" и: ВЫБРАТЬ entry_id, название, author_id FROM exp_weblog_titles WHERE entry_id IN ("% s") В каждом запросе есть четкие предложения WHERE, и мои знания SQL ограничены, могу ли я объединить оба запроса в один? –

+1

-1 Насколько вы уверены, что «на уровне базы данных было бы намного быстрее и аккуратнее». Не думаете ли вы, что подключение к базе данных, объединение двух таблиц или более, и возвращение результата будет намного медленнее. Я настоятельно рекомендую вам читать «MySQL High Performance», чтобы получить представление о базе данных и индексировании. Присоединение к двум таблицам на уровне приложения происходит быстрее, так что гораздо больше шансов на то, что MySQL будет получать результат быстрее, потому что каждый запрос будет извлечен его быстрым быстрым ключом. Это было бы гораздо более идеальным, если вы хотите кэшировать его в веб-приложении. – ALH

-1
+0

Если вы прочитаете вопрос, станет ясно, что это не то, что нужно. Я думаю, что приведенные примеры массивов - это отдельные элементы большего массива. – Yacoby

+0

array_merge только добавит второй массив к первому, я хочу присоединиться к ним с помощью 'entry_id', который является уникальным ключом в обоих массивах –

+0

извините, моя ошибка – Tobias

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, если запись содержит более одного автора, две или несколько строк будут возвращены.