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] – это инкрементное число

Объединение этого массива должно основываться на значении [text]. Как я могу сделать это с помощью php в быстром режиме?

Спасибо за помощь.

Если это массив

 $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); с $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); 

Что-то вроде этого может быть:

 $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']); } 

Попробуй это:

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