2015-06-09 70 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

按照您的建议初始化 –