繁体   English   中英

总结数组php中的值

[英]sum up values in an array php

我从各种浏览器中获得了一个站点页面视图数组,并且我试图从该数组中搜索特定浏览器的唯一出现次数,并对每个值的总和求和。

原始数据形式

$data = array(
            array("Browser Version", "Pageviews", "Visits"),
            array("Firefox 39.0", "93", "47"),
            array("Chrome 44.0.2403.125", "88", "26"),
            array("Chrome 44.0.2403.130", "34", "11"),
            array("Chrome 44.0.2403.107", "57", "10"),
            array("Chrome 44.0.2403.155", "22", "9"),
            array("Chrome 43.0.2357.134", "11", "4"),
            array("Chrome 44.0.2403.133", "5", "4"),
            array("Chrome 44.0.2403.89", "4", "3"),
            array("Opera 30.0.1835.125", "4", "3"),
            array("Opera 31.0.1889.99", "9", "3"),
            array("Chrome 43.0.2357.93", "2", "2"),
            array("Firefox 28.0", "5", "2"),
            array("BlackBerry 7.1.0.714", "1", "1"),
            array("Chrome 36.0.1985.135", "2", "1"),
            array("Firefox 40.0", "1", "1"),
            array("Internet Explorer 9.0", "2", "1")
);

现在,我正在尝试搜索特定的浏览器,然后汇总每个浏览器的值

        $browsersArray = array();

            $browsersArray["Firefox"] = array(); 

            $browsersArray["Chrome"] = array();

            $browsersArray["Internet Explorer"] = array();

            $browsersArray["Safari"] = array();

            $browsersArray["Opera"] = array();  

$result_browser = '';
$result_browser_pageview = '';

$i = 0; 
foreach ($data as $data_row) { 
            $i++; 
            echo '<tr>';
    while (list($key, $value) = each ($data_row)) { 

        if($key == 0){
            $result_browser = $value;
        }
        elseif($key == 1){
            $result_browser_pageview = $value;
        }

            if($key == 0){      

                $firefoxSearchPos = stripos($result_browser, "Firefox");
                $chromeSearchPos = stripos($result_browser, "Chrome");
                $ieSearchPos = stripos($result_browser, "Internet Explorer");
                $safariSearchPos = stripos($result_browser, "Safari");
                $operaSearchPos = stripos($result_browser, "Opera");

                if($firefoxSearchPos !== false) {
                    $browsersArray["Firefox"][] = $result_browser_pageview;
                }
                elseif($chromeSearchPos !== false) {
                    $browsersArray["Chrome"][] = $result_browser_pageview;
                }
                elseif($ieSearchPos !== false) {
                    $browsersArray["Internet Explorer"][] = $result_browser_pageview;
                }
                elseif($safariSearchPos !== false) {
                    $browsersArray["Safari"][] = $result_browser_pageview;
                }
                elseif($operaSearchPos !== false) {
                    $browsersArray["Opera"][] = $result_browser_pageview;
                }
            }
    } // end while
} 

我无法基于$ data数组获取每个的实际总和

例如Firefox应该让我的总pageview为99,总访问量为50。

您的代码中没有数学运算,您只是通过以下方式将页面视图放入数组中的新元素中:

$browsersArray["Firefox"][] = $result_browser_pageview;

应该是这样的:

$pageViews["Firefox"] += $result_browser_pageview;

+ =取原始值并将其添加。 赋值运算符上查看更多内容。

为什么甚至有while()循环? 然后,您要做的就是检查要测试的键,并始终跳过大部分循环迭代。 毫无意义。 这实在使人厌烦了编程。

简单地说:

foreach($data as $browser) {
    if (stripos($browser[0]), "Firefox") !== false ) {
       $browsersArray['Firefox'][] = $browser;
    }
    etc...
}

而更紧凑的版本将使用正则表达式:

foreach($data as $browser) {
    if (preg_match('/^(Firefox|Chrome|Internet Explorer|etc...)/', $browser[0], $matches)) {
       $browsersArray[$matches[1]][] = $browser;
    } else {
       $browsersArray['unknown'][] = $browser;
    }
}

你可以做类似的事情

foreach (array('Firefox', 'Chrome', 'Opera', 'BlackBerry', 'Internet Explorer') as $browser) {
    $rows = array_filter($data, function($item) use ($browser) {
        return strpos($item[0], $browser) === 0;
    });
    $pageViews = array_sum(array_map(function($item) {
        return $item[1];
    }, $rows));

    // obviously you can create an array here too
    echo "$browser page views: $pageViews".PHP_EOL;
}

这使

Firefox page views: 99
Chrome page views: 225
Opera page views: 13
BlackBerry page views: 1
Internet Explorer page views: 2 

尝试这样的事情:

$result = array();
foreach($data as $row){
    if(@$i++ < 1) continue; // skip first line
    $fullName = array_shift($row);
    preg_match('~^([^\d]+)\s\d~',$fullName,$nameGroup);
    $name = $nameGroup[1];
    array_map('intval',$row);
    if(isset($result[$name])){
        foreach($row as $key => $value){
            $result[$name][$key] += $value;
        }
    }else{
        $result[$name] = $row;
    }
}

var_dump($result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM