2013-07-18 2 views
0

어떻게이 배열을 병합 할 수 있습니까? 이런PHP - 키로 2D 배열 병합

Array 
    (
     [0] => Array 
      (
       [type] => Person 
       [relevance] => 0.700000 
       [count] => 300 
       [text] => Chris 
      ) 
    ) 
    Array 
    (
     [0] => Array 
      (
       [type] => Person 
       [relevance] => 0.900000 
       [count] => 400 
       [text] => Chris 
      ) 

     [1] => Array 
      (
       [type] => Person 
       [relevance] => 0.500000 
       [count] => 200 
       [text] => Tom 
      ) 
    ) 

또는 배열 :

Array 
     (
      [0] => Array 
       (
        [type] => Person 
        [relevance] => 0.700000 
        [count] => 300 
        [text] => Chris 
       ) 


      [1] => Array 
       (
        [type] => Person 
        [relevance] => 0.900000 
        [count] => 400 
        [text] => Chris 
       ) 

      [2] => Array 
       (
        [type] => Person 
        [relevance] => 0.500000 
        [count] => 200 
        [text] => Tom 
       ) 
     ) 

예상 결과는 다음

Array 
(
    [0] => Array 
     (
      [type] => Person 
      [relevance] => 0.800000 
      [count] => 700 
      [text] => Chris 
     ) 



    [1] => Array 
     (
      [type] => Person 
      [relevance] => 0.500000 
      [count] => 200 
      [text] => Tom 
     ) 
) 

[관련성] 값

[카운트] 값은 증분 평균 개수 번호

이 배열의 병합은 [텍스트] 값에 기초해야합니다. 어떻게 PHP로 이것을 빠르게 할 수 있습니까?

도와 주셔서 감사합니다. 이 아마도 같은

답변

2

을이

$array = Array(
    Array(
     'type' => 'Person', 
     'relevance' => .7, 
     'count' => 300, 
     'text' => 'Chris' 
    ), 
    Array(
     'type' => 'Person', 
     'relevance' => .9, 
     'count' => 400, 
     'text' => 'Chris' 
    ), 
    Array(
     'type' => 'Person', 
     'relevance' => .5, 
     'count' => 200, 
     'text' => 'Tom' 
    ), 
); 

다음 배열 인 경우 :

+0

평균보다 나은 평균을내는 방법이 마음에 듭니다. +1 –

+0

고맙습니다 ...하지만 다른 빠른 해결책이 있다고 생각합니다 .--) 다른 답변을 기다리고 있습니다. –

+0

@chumkiu 답변을 시도했지만 완벽하게 작동합니다. 감사 –

2

뭔가 :

$newArray = array(); 

foreach ($oldArray as $item) { 
    if (!array_key_exists($item['text'], $newArray)) { 
     $newArray[$item['text']] = $item; 
     $newArray[$item['relevance_values']] = array(); 

    } else { 
     $newArray[$item['text']]['count'] += $item['count']; 
     $newArray[$item['relevance_values']][] = $item['relevance']; 
    } 
} 

foreach ($newArray as $item) { 
    $relevance = 0; 
    foreach ($item['relevance_values'] as $value) { 
     $relevance += $value; 
    } 
    $item['relevance'] = $relevance/count($item['relevance_values']); 
} 
+0

그는 'newArray'에서 숫자 키를 요구했습니다. –

+0

@JohnVanDeWeghe 그는 대신에 배열 된 배열을 얻기 위해'array_values ​​($ newArray)'를 사용할 수 있습니다. –

1

이 시도 :

function mergeOnText($array){ 
    $results = array(); 
    foreach($array as $person){ 
     $found = -1; 
     foreach($results as $i => $res) 
      if($res['text'] == $person['text']){ 
       $found = $i; 
       break; 
      } 
     if($found > -1){ 
      $results[$found]['relevance'][] = $person['relevance']; 
      $results[$found]['count'] += $person['count']; 
     } else { 
      $results[] = $person; 
     } 
    } 
    foreach($results as $i => $res) 
     $results[$i]['relevance'] = array_sum($res['relevance'])/count($res['relevance']); 
    return $results; 
}