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

时间:2014-09-25 12:21:38

标签: php arrays algorithm

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

$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'] ['08'] ['2'] 是相同的(只有'www。'不同) 我想合并这些单元格并添加它们的值(因为它是同一个站点!),以便获得具有两个主机名的站点的总访问量。

$ sites 视为站点对象(网站)的数组。 getHost()方法将返回没有'www'的示例'my-host.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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

尝试用“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];
  }