簡體   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