Bu PHP kodu performansını artırmak için basitleştirilmiş olabilir?

4 Cevap php

Bu kodun amacı, bir diziye bütün mağazalar için tüm markalar olsun, ve ekrana çıktı bu etmektir. Bir marka birden çok mağaza varsa, sadece bir kez eklenecektir.

But I feel I have too many for loops, and that it might choke the CPU on heavy traffic. Is there a better solution to this?

  function getBrands($stores, $bl)
  {
    $html = "";

    //Loop through all the stores and get the brands
    foreach ($stores as $store)
    {
      //Get all associated brands for store
      $result = $bl->getBrandsByStore($store['id']);

      //Add all brands to array $brands[]
      while ($row = mysql_fetch_array($result))
      {
        //If this is the first run, we do not need to check if it already exists in array
        if(sizeof($brands) == 0)
        {
          $brands[] = array("id" => $row['id'], "name" => $row['name']);
        }
        else
        {
          // Check tosee if brand has already been added.
          if(!isValueInArray($brands, $row['id']))
            $brands[] = array("id" => $row['id'], "name" => $row['name']);
        }
      }
    }

    //Create the HTML output
    foreach($brands as $brand)
    {
      $url = get_bloginfo('url').'/search?brandID='.$brand['id'].'&brand='.urlSanitize($brand['name']);
      $html.= '<a href="'.$url.'" id="'.$brand['id'].'" target="_self">'.$brand['name'].'</a>, ';
    }

    return $html;
  }

  //Check to see if an ID already exists in the array
  function isValueInArray($values, $val2)
  {
    foreach($values as $val1)
    {
      if($val1['id'] == $val2)
        return true;
    }
    return false;
  }

4 Cevap

Yorumlarınız itibaren, "Kılavuzu masa X mağazası var ve her mağaza Y markalara sahiptir" söz. Muhtemelen bir "mağaza" masa, bir "marka" masa ve bir "bağlantı" masa çiftleri doğru, bir tek-mağaza-çok-marka ilişkisinde, brand_id için store_id ki, var?

Eğer öyleyse, tek bir SQL sorgusu görevi yapabilirsiniz:

SELECT b.`id`, b.`name`
FROM `stores` s
LEFT JOIN `linkage` l
  ON l.`store`=s.`id`
LEFT JOIN `brands` b 
  ON b.`id`=l.`brand`
GROUP BY b.`id`;

Bu son GROUP BY deyimi yalnızca her marka bir kez gösterecektir. Eğer bunu kaldırırsanız, mağaza kimliği ve çıkış mağaza için-marka derneklerin tam listesini ekleyebilirsiniz.

Dizilerin iki set (biri markaların dizi oluşturmak için, ve sonra bir HTML yapmak için) döngü gerek yok. array_key_exists işlevini kullanın ve bir anahtar olarak kimliğini kullanmak - yardımcınız fonksiyon ile bir döngü yapar Özellikle beri. Eğer varolan kodu size olurdu ucunda bir virgül olurdu (elle yapmak zorunda kalmamak Plus ',' ile bağlantıları katılmak için implode işlevini kullanabilirsiniz ) keserek. Sen döngüler için iki set olmadan bunu yapabilirsiniz:

function getBrands($stores, $bl) 
{
    $brands = array();

    //Loop through all the stores and get the brands
    foreach ($stores as $store)
    {
        //Get all associated brands for store
        $result = $bl->getBrandsByStore($store['id']);

        //Add all brands to array $brands[]
        while ($row = mysql_fetch_array($result))
        {
            if (!array_key_exists($row['id'])
            {

                $url = get_bloginfo('url') . '/searchbrandID=' . 
                       $brand['id'] . '&brand=' . urlSanitize($brand['name']);
                $brands[$row['id']] .= '<a href="' . $url . '" id="' . 
                                       $brand['id'] . '" target="_self">' . 
                                       $brand['name'] . '</a>';
            }
        }
    }

    return implode(', ', $html);
}

Bu size biraz daha hızlı aynı etkiyi alırsınız. Eğer markalar almak için döngü için kullanılır ve daha sonra döngü aracılığıyla ve HTML kurmak çünkü daha hızlı olacak. Bu iki ayrı döngüler gibi tüm bu kadar bir kerede ve birlikte gitmek gibi sadece HTML saklamak yapmak gerekmez. Artı yerine çek bir marka var olup olmadığını görmek için yine döngü ile, daha hızlı iyileştiğini göreceksiniz yazdı yardımcısı, array_key_exists kullanmak geçti beri. HashMap her öğe bir anahtarı vardır ve bir anahtar olup olmadığını görmek için yerli fonksiyonları vardır çünkü Hashmaps böyle güzel.

Sen daha böylece bir foreach içinde bir süre yapmak zorunda değilsiniz bunu yapmak için ayrı bir filtre ile daha iyi bir SQL ifadesi yazarak şeyleri optimize olabilir.

Nasıl tablo tasarlanmıştır? Bir mağaza tablo, bir tablo marka, mağaza ve markalar arasındaki ilişki vardı bir bağlantı tablo olsaydı, sadece tek bir sorguda marka tablosundan markaların listesinde çekin ve diğer herhangi bir mantığı yapmak zorunda değil.

Kolayca sormak gerekir soruları cevaplamak böylece tabloları tasarlayın.

Eğer mağazalarında belli bir dizi için tüm markalar almak gerekiyorsa o zaman yerine tüm mağazaları yineleme ve bilgi ayrı parçalar alma yapmak için hazırlanmış bir sorgu kullanarak düşünmelisiniz.