2009-06-14 2 views
2

У меня есть два массива ...PHP - объединение массивов

$arr1 = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'short'), 
    'address', 
    'zipcode' => array('default' => 12345, 'hidden' => true) 
); 

$arr2 = array(
    'name', 
    'language', 
    'date' => array('format' => 'long', 'hidden' => true), 
    'zipcode' => array('hidden' => false) 
); 

Вот желаемый результат:

$final = array(
    'name', 
    'date' => array('default' => '2009-06-13', 'format' => 'long', 'hidden' => true), 
    'zipcode' => array('default' => 12345, 'hidden' => false) 
); 
  • только элементы из $ arr2 (которые также существуют в $ arr1) являются
  • Атрибуты каждого элемента объединены
  • Если общий элемент (например, zipcode) разделяет атрибут (например, скрытый), то t он атрибут из $ arr2 имеет преимущество

Каковы некоторые хорошие подходы к решению этой проблемы?

Заранее спасибо.

EDIT: Я пытался что-то хромать вместе ... критика приветствуется:

$new_array = array_intersect_key($arr2, $arr1); 

foreach ($new_array as $key => $val) 
{ 
    if (is_array($arr1[$key])) 
    { 
     if (is_array($val)) 
     { 
      $new_array[$key] = array_merge($val, $arr1[$key]); 
     } 
     else 
     { 
      $new_array[$key] = $arr1[$key]; 
     } 
    } 
} 
+1

Хорошая практика в этом случае - опубликовать такой код как ответ на ваш собственный вопрос. – Eric

+0

Проблема в том, что вышеупомянутое «решение» не работает ... – Matt

+0

Я смотрел на это, но мне интересно, о небольшой несогласованности. Вам все равно, что подходит для первого измерения массива, а затем объединить все во втором измерении, переписать? Кроме того, будет ли это распространяться на два измерения? –

ответ

2

Вы были близки

$newArr = array_intersect_key($arr1, $arr2); 
foreach ($newArr as $key => $val) 
{ 
    if (is_array($val)) 
    { 
     $newArr[$key] = array_merge($arr1[$key], $arr2[$key]); 
    } 
} 

Редактировать Просто нужно было изменить array_intersect на array_intersect_key

+0

Это тоже не совсем правильно. Если $ arr1 ['address'] является массивом, то он все равно доходит до конечного результата ...: \ – Matt

+0

Я действительно не проверял его, он просто дал мне правильный результат, поэтому я остановился: x. Позвольте мне еще раз взглянуть. –

0

вы можете найти array_intersect() полезный

link text

+0

Я предполагаю, что он знает о функции по тому факту, что подмножество таких включено в его примерный код. –