2012-04-30 1 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 
     ) 
) 

이 하나의 $가

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

은 다음과 같습니다 하나의 배열 $ 완전한으로 결합 할 수 있습니다 likes_dislikes, 어디 두 번째 배열의 정보가 "이름"값과 일치하면 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']) 
} 

처럼 난 그냥 모두 좋아하는/싫어하는에 대해 동일한 값을 얻을 것이다 말하는 경우에 때문에 나는 foreach 루프에 붙어있어. 가장 간단한 방법은 무엇입니까?

+0

당신은 첫 번째 배열을 통해 루프 그가 무엇을 좋아하는이라면 첵은 두번째 버텍스 배열을 통해 반복해야한다 . – Zombaya

+1

복제본 인 경우 http://stackoverflow.com/questions/2123070/php-search-array-and-add-content-on-position-where-ids-are-equal – gcochard

+0

중복되면 삭제하십시오. 다음 번에 더 잘 검색 할 것입니다. –

답변

1

가 (중첩 된 foreach 루프가 좋은 선택이 될 것입니다) 배열의 두 세트를 통해 루프, 이름 속성은 두 배열에서 동일 인스턴스에 대한 확인. 배열이있을 때 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

미친 1 라이너 (기술적으로는 한 줄로 계산됩니다)가 작동해야합니다.

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