2013-07-18 71 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 
     ) 
) 

[相关性]值是平均值数

[COUNT]值是增量号码

这些数组的合并应基于[文本]值。 我该如何用快速的方法来做到这一点?

感谢您的帮助。

回答

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' 
    ), 
); 

则:

$tmp = Array(); 

foreach($array as $obj) { 
    if(!isset($tmp[$obj['text']])) { 
     $tmp[$obj['text']] = array_merge(Array('total_count'=>1),$obj); 
     continue; 
    } 
    $tmp[$obj['text']]['count']  += $obj['count']; 
    $tmp[$obj['text']]['relevance'] += $obj['relevance']; 
    $tmp[$obj['text']]['total_count']++; // useful for average calculation 
} 

$result = Array(); 

foreach($tmp as $key=>$obj) { 
    $obj['relevance'] = $obj['relevance']/$obj['total_count']; 
    unset($obj['total_count']); // useless now 
    $result[] = $obj; 
} 

print_r($result); 
+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; 
}