具有多个值的PHP数组需要一种GroupBy


PHP Array with multiple values need a sort of Group By

我已经在寻找我的问题的解决方案,但我根本不明白答案,也许是因为它们对我的问题没有用处,但别介意,我仍然没有想出如何做到这一点。

我有一个结构如下的数组:

Array ( 
    [Firefox] => 
     Array ( 
         [name] => Firefox 
         [clicks] => 0 
         [requests] => 5731 
           ) 
     ) 

Array ( 
        [Firefox] => 
         Array ( 
             [name] => Firefox 
             [clicks] => 0 
             [requests] => 5731 
               ) 
         ) 
Array ( 
            [Internet Explorer] => 
             Array ( 
                 [name] => Internet Explorer
                 [clicks] => 1 
                 [requests] => 1973
                   ) 
             ) 

由这部分代码生成:

    $q1="SELECT r.ua, count(c.rid) as cnum, count(r.kwd) as rnum
    FROM requests r LEFT JOIN clicks_214 c ON r.id=c.rid
    WHERE hid='$hid' 
    AND r.time BETWEEN '$date1 $hour1:00:00' AND '$date2 $hour2:00:00'
    GROUP BY r.ua
    ORDER BY rnum DESC
    LIMIT $limit,50";
    $qr1=mysqli_query($conn,$q1) or die (mysqli_error());
    while(($r=mysqli_fetch_assoc($qr1))!=null)
    {
        $brow_obj=new Browser($r['ua']);
        $brow=$brow_obj ->getBrowser();
        $b_array[$brow]['name'] = $brow;
        $b_array[$brow]['clicks'] = $r['cnum'];
        $b_array[$brow]['requests'] = $r['rnum'];
    }

我的问题是,我所要做的只是一个GROUP BY浏览器名称(Firefox、Internet Explorer、Chrome…),并将所有点击和对该名称的请求相加,显然可以删除重复项,例如:

名称:Firefox点击次数:Firefox的所有点击次数请求:Firefox 的所有请求

名称:Internet Explorer点击次数:IE的所有点击次数请求:IE 的所有请求

但根本不起作用这是表格结构:

请求

id(PK),ua(user agent),kwd,hid(FK),time

点击

id(PK),rid(FK)

问题解决了,考虑这个问题花了几个小时,但实际上并没有那么困难:)

foreach ($b_array as $item) 
{
    $key = $item['name'];
    if (!isset($browsers[$key])) 
    {
        $browsers[$key] = array(
            'name' => $item['name'],
            'clicks' => $item['clicks'],
            'requests' => $item['requests'],
        );
    } 
    else 
    {
        $browsers[$key]['clicks'] += $item['clicks'];
        $browsers[$key]['requests'] += $item['requests'];
    }
}
相关文章: