2015-06-09 72 views
2

我試圖將高級別產品評論數據插入到SKU記錄中,但我試圖獲取重複鍵的平均值。PHP多維數組,重複值的平均值

Array 
(
    [0] => Array 
     (
      [sku] => 70835 
      [rating] => 5 
     ) 

    [1] => Array 
     (
      [sku] => F6W/35 
      [rating] => 5 
     ) 

    [2] => Array 
     (
      [sku] => 36865 
      [rating] => 5 
     ) 

    [3] => Array 
     (
      [sku] => 36835 
      [rating] => 5 
     ) 

    [4] => Array 
     (
      [sku] => F30W/T8/830/POLYLUX 
      [rating] => 2 
     ) 

    [5] => Array 
     (
      [sku] => 70835 
      [rating] => 4 
     ) 
) 

我想獲得的平均得分爲重複的SKU因此預計產出將是:

Array 
(
    [0] => Array 
     (
      [sku] => 70835 
      [rating] => 4.5 
     ) 

    [1] => Array 
     (
      [sku] => F6W/35 
      [rating] => 5 
     ) 

    [2] => Array 
     (
      [sku] => 36865 
      [rating] => 5 
     ) 

    [3] => Array 
     (
      [sku] => 36835 
      [rating] => 5 
     ) 

    ... 
) 

我有下面的循環被重複的總結,但我掙扎着爬了平均值

foreach ($reviews as $val) { 
    if (!isset($result[$val['sku']])) 
    { 
     $result[$val['sku']] = $val; 
    } 
    else{ 
     $result[$val['sku']]['rating'] += $val['rating']; 
     #This will sum the duplicated ratings but I need to divide the sum here by the number of times the 'sku' index was duplicated so in the example 9/2 = 4.5 
    } 
} 

在此先感謝!

+1

你是如何獲取數據?這可以在數據庫級別容易地完成(假設這是數據的來源) – billyonecan

回答

0

增加一個計數字段,以您的結果數組是什麼...

foreach ($reviews as $val) { 
    if (!isset($result[$val['sku']])) 
    { 
     $result[$val['sku']] = $val; 
     $result[$val['sku']]["count"] = 1; 
    } 
    else{ 
     $result[$val['sku']]['rating'] += $val['rating']; 
     $result[$val['sku']]["count"] ++; 
    } 
} 

foreach($result as $k => $v) { 
    $result[$k]['avg'] = $v['rating']/$v['count']; 
} 
+0

你將'$ result [$ val ['sku']]'設置爲'$ val',然後你試圖編輯一個數組索引(在'$ result ['val ['sku' ]]')在一個非數組上。 – FrankerZ

+0

'$ val'是一個數組,所以它應該工作 – steven

+0

是的,我的壞。對您的帖子進行快速編輯,然後刪除downvote。 (雖然我很猶豫是要在數組中放入更多的冗餘數據(IE。SKU,當它已經是密鑰的時候),但這只是我。) – FrankerZ

1

這應該爲你工作:

foreach ($reviews as $val) { 
    if (!isset($result[$val['sku']])) 
    { 
     $result[$val['sku']] = array('rating' => $val['rating'], 'count' => 1); 
    } 
    else{ 
     $result[$val['sku']]['rating'] += $val['rating']; 
     $result[$val['sku']]['count']++; 
    } 
} 

foreach ($result as &$val) { 
    $val['average'] = $val['rating']/$val['count']; 
} 

要知道,如果這個數據是從數據庫中來,有更容易的方式來做到這一點,利用GROUP BY語句。

+0

第一個循環中的'$ val'是一個數組,因此您不能這樣做:'$ result [$ val ['sku']] ['val'] + = $ val ['rating'];' – steven

+0

更新我的答案,並使變量更清晰。 – FrankerZ

+0

是的,我看到了。我認爲這兩個答案現在應該工作 – steven

1
[[email protected] tmp]$ cat test.php 
<?php 

$array = array (
    0 => 
    array (
    'sku' => '70835', 
    'rating' => '5', 
), 
    1 => 
    array (
    'sku' => 'F6W/35', 
    'rating' => '5', 
), 
    2 => 
    array (
    'sku' => '36865', 
    'rating' => '5', 
), 
    3 => 
    array (
    'sku' => '36835', 
    'rating' => '5', 
), 
    4 => 
    array (
    'sku' => 'F30W/T8/830/POLYLUX', 
    'rating' => '2', 
), 
    5 => 
    array (
    'sku' => '70835', 
    'rating' => '4', 
), 
); 

$final=$count=array(); 

foreach($array as $v) 
{ 
    if(isset($final[$v['sku']])) 
    { 
     $final[$v['sku']]['rating'] += $v['rating']; 
     $count[$v['sku']]++; 
    }else 
    { 
     $final[$v['sku']] = $v; 
     $count[$v['sku']] = 1; 
    } 

} 

array_map(function($a, $b) use (&$final){ $final[$a]['rating']/=$b; }, array_keys($count),array_values($count)); 
unset($count); 

// Input 
print_r($array); 

// Output 
print_r(array_values($final)); 

?> 

輸出

[[email protected] tmp]$ php test.php 
Array 
(
    [0] => Array 
     (
      [sku] => 70835 
      [rating] => 5 
     ) 

    [1] => Array 
     (
      [sku] => F6W/35 
      [rating] => 5 
     ) 

    [2] => Array 
     (
      [sku] => 36865 
      [rating] => 5 
     ) 

    [3] => Array 
     (
      [sku] => 36835 
      [rating] => 5 
     ) 

    [4] => Array 
     (
      [sku] => F30W/T8/830/POLYLUX 
      [rating] => 2 
     ) 

    [5] => Array 
     (
      [sku] => 70835 
      [rating] => 4 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [sku] => 70835 
      [rating] => 4.5 
     ) 

    [1] => Array 
     (
      [sku] => F6W/35 
      [rating] => 5 
     ) 

    [2] => Array 
     (
      [sku] => 36865 
      [rating] => 5 
     ) 

    [3] => Array 
     (
      [sku] => 36835 
      [rating] => 5 
     ) 

    [4] => Array 
     (
      [sku] => F30W/T8/830/POLYLUX 
      [rating] => 2 
     ) 

) 
+0

在未初始化數組($ count)之前,這是一個非常糟糕的習慣你寫信給他們。 – FrankerZ

+0

按照您的建議初始化 –