2012-04-30 4 views
1

Допустим, я хочу объединить 2 массива, а массивы - имена $ year_into и $ likes_dislikes. У них есть ключ под названием «имя». Как я могу сделать это так, что это один:Объединение массивов в php

$ year_info

Array 
(
    [0] => Array 
     (
      [name] => JOE MONROE 
      [year] => 1950 
      [info] => his ghost still haunts us 
     ) 
    [1] => Array 
     (
      [name] => FUTUREMAN 
      [year] => 1930 
      [info] => RIP 
     ) 
) 

и это один $ likes_dislikes

Array 
(
    [0] => Array 
     (
      [name] => JOE MONROE 
      [likes] => cornbread 
      [dislikes] => pain 
     ) 
    [1] => Array 
     (
      [name] => E. Case 
      [likes] => chaos 
      [dislikes] => order 
     ) 
    [2] => Array 
     (
      [name] => FUTUREMAN 
      [likes] => mustard 
      [dislikes] => mayo 
     ) 
) 

Может быть объединены в один массив $ Комплект, который выглядит, как это, где информация из 2-го массива добавляется к 1-му, если значение «имя» соответствует:

Array 
(
    [0] => Array 
     (
      [name] => JOE MONROE 
      [year] => 1950 
      [info] => his ghost still haunts us 
      [likes] => cornbread 
      [dislikes] => pain 
     ) 
    [1] => Array 
     (
      [name] => FUTUREMAN 
      [year] => 1930 
      [info] => RIP 
      [likes] => mustard 
      [dislikes] => mayo 
     ) 
) 

У меня есть просмотрел уже заданные вопросы, но ничего не вижу, может быть, я использую неправильную терминологию для описания проблемы. Я застрял на петле Еогеаспа, потому что, если я скажу, как этот

foreach ($year_info as $y){ 
    $complete[]=array('name'=>$y['name'], 'year'=>$y['year'], 'info'=>$y['info'], 'likes'=$likes_dislikes[0]['likes'],'dislikes'=>$likes_dislikes[0]['dislikes']) 
} 

Я просто получить то же значение нравится/не нравится для всех. Каков самый простой способ сделать это?

+0

Вы должны перебирают первый массив, а затем Chek, если он любит что-нибудь будете зацикливанием над seccond массивом , – Zombaya

+1

Дубликат http://stackoverflow.com/questions/2123070/php-search-array-and-add-content-on-position-where-ids-are-equal – gcochard

+0

ahh, если это дубликат, то, пожалуйста, удалите. В следующий раз я буду искать лучше. –

ответ

1

Что я пытаюсь сделать, это перебрать обоих наборов массивов (вложенный цикл по каждому элементу будет хорошим выбором), проверяя, например, когда имя атрибута является одинаковым в обоих массивах. Когда они есть, вы можете использовать array_merge(), чтобы объединить их в новый массив. Примером может служить:

$newArray = array(); 
foreach ($arr1 as $first) { 
    foreach ($arr2 as $second) { 
     if($first["name"] == $second["name"]){ 
      array_push($newArray, array_merge($first, $second)); 
     } 
    } 
} 

Предполагая, что вы назвали свои массивы $ arr1 и $ arr2.

+0

Спасибо всем, многие из них будут работать. –

1

супер-ленивый, экстра-описательный подход:

$complete = array(); 

foreach($year_info as $yr){ 
    $name = $yr['name']; 
    foreach($likes_dislikes as $ld){ 
    if($ld['name']!=$name){ 
     continue; 
    }else{ 
     $new_entity = array(); 
     $new_entity['name'] = $name; 
     $new_entity['year'] = $yr['year']; 
     $new_entity['info'] = $yr['info']; 
     $new_entity['likes'] = $ld['likes']; 
     $new_entity['dislikes'] = $ld['dislikes']; 
     $complete[] = $new_entity; 
     break; 
    } 
    } 
} 

Хотя это будет работать плохо с большими массивами, было бы больше смысла, чтобы изменить структуру данных, если это возможно. Было бы лучше иметь структуры данных, которые были бы просто введены по имени. У вас есть контроль над вашим вводом?

1

просто переверните оба массива, чтобы создать третий.

$complete = array(); 
foreach ($year_info as $year) { 
foreach ($like_dislikes as $like { 
if ($year['name'] == $like['name']) { 
$complete[] = array_merge($year, $like); 
} 
} 
} 
2

Вот сумасшедший однострочный (я думаю, это технически считается одной строкой), что должно сработать.

$complete = array_map(function($a) use($likes_dislikes){ 
    foreach($likes_dislikes as $ld){ 
     if($a['name'] === $ld['name']){ 
      return $a + $ld; 
      break; 
     } 
    } 
}, $year_info); 

Это будет работать только в PHP 5.3+, в противном случае вы можете сделать это следующим образом:

$complete = array(); 
foreach($year_info as $a){ 
    foreach($likes_dislikes as $ld){ 
     if($a['name'] === $ld['name']){ 
      $complete[] = $a + $ld; 
      break; 
     } 
    } 
} 
Смежные вопросы