如何改进合并数组行的算法


How to improve an algorithm where we merge lines of an array

我有一个这样的数组=>这是谷歌分析请求的结果。我询问了过去三个月的访问次数。

$statPerMonth
array (size=2)
  '08' =>     // The month (August)
    array (size=34)
      0 => 
        array (size=3)
          0 => string '08' (length=2) // Month again
          1 => string 'admin.testweb.fr' (length=19) // host
          2 => string '1' (length=1)  // amount of visits
      1 => 
        array (size=3)
          0 => string '08' (length=2)
          1 => string 'audigie-espace-auto.reseau-fivestar.fr' (length=38)
          2 => string '6' (length=1)
      2 => 
        array (size=3)
          0 => string '08' (length=2)
          1 => string 'www.audigie-espace-auto.reseau-fivestar.fr' (length=31)
          2 => string '9' (length=1)
      3 => 
        array (size=3)
          0 => string '08' (length=2)
          1 => string 'carrosserie-abberis.reseau-fivestar.fr' (length=38)
          2 => string '7' (length=1)
'07' => 
    array (size=47)
      0 => 
        array (size=3)
          0 => string '07' (length=2)
          1 => string 'www.anothersite.testweb.fr' (length=13)
          2 => string '1' (length=1)
      1 => 
        array (size=3)
          0 => string '07' (length=2)
          1 => string 'admin.testweb.fr' (length=16)
          2 => string '2' (length=1)
      2 => 
        array (size=3)
          0 => string '07' (length=2)
          1 => string 'admin.testweb.fr' (length=19)
          2 => string '1' (length=1)
      3 => 
        array (size=3)
          0 => string '07' (length=2)
          1 => string 'audigie-espace-auto.reseau-fivestar.fr' (length=38)
          2 => string '20' (length=2)
      4 => 
        array (size=3)
          0 => string '07' (length=2)
          1 => string 'www.admin.testweb.fr' (length=19)
          2 => string '1' (length=1)

此数组代表我的网站访问量,但是您可以看到值['08']['1'][008']['2']

$sites视为站点对象(网站)的数组。getHost()方法将返回不带"www"的站点主机,例如"myhost.fr"考虑上面解释的$statsPerMonth数组

最后考虑这个算法

foreach ($statsPerMonth as $actualMonth => $stats) {
            foreach($sites as $site) {
                $siteHost = $site->getHost();
                foreach ($stats as $row) {
                    if (strstr($row['1'], $siteHost)) {
                        if(isset($globalStats[$actualMonth][$siteHost])) {
                            $globalStats[$actualMonth][$siteHost] = $globalStats[$actualMonth][$siteHost] + $row['2'];
                        } else {
                            $globalStats[$actualMonth][$siteHost] = 0;
                            $globalStats[$actualMonth][$siteHost] = $globalStats[$actualMonth][$siteHost] + $row['2'];
                        }
                    }
                    if(!isset($globalStats[$actualMonth][$siteHost])) {
                        $globalStats[$actualMonth][$siteHost] = 0;
                    }
                }
            }
        }

此算法以这种形式返回$globalStats数组

array (size=3)
  '08' => 
    array (size=43)
      'carrosserie-la-cascade.reseau-fivestar.fr' => int 1
      'audigie-espace-auto.reseau-fivestar.fr' => int 15
      'carrosserie-abberis-fivestar.fr' => int 16
      'carrosserie-arenales-jonathan.reseau-fivestar.fr' => int 0
'07' => 
    array (size=43)
      'carrosserie-la-cascade.reseau-fivestar.fr' => int 2
      'audigie-espace-auto.reseau-fivestar.fr' => int 20
      'carrosserie-abberis-fivestar.fr' => int 0
      'carrosserie-arenales-jonathan.reseau-fivestar.fr' => int 4
'06' => 
    array (size=43)
      'carrosserie-la-cascade.reseau-fivestar.fr' => int 0
      'audigie-espace-auto.reseau-fivestar.fr' => int 29
      'carrosserie-abberis-fivestar.fr' => int 0
      'carrosserie-arenales-jonathan.reseau-fivestar.fr' => int 4

这正是我想要的,但我认为我们可以改进这个算法,使其更高效(因为数组很大)。为了使这个算法更好,你有什么想法吗?

谢谢。

尝试用"for"替换所有"foreach",例如:

  foreach ($array as $key => $value) {
  }

通过

  $keys = array_keys($array);
  $keyCount = count($keys);
  for($i = 0; $i < $keyCount; $i++) {
    $key = $keys[$i];
    $value = $array[$key];
  }