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

[актуальность] значение представляет собой среднее число

значение [число] инкрементный номер

Слияние этого массива должно основываться на значении [text]. Как я могу сделать это с помощью 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' 
    ), 
); 

затем:

$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; 
} 
Смежные вопросы