Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] plik z tablica 600 elementową.. jak przyspieszyc działanie?
Forum PHP.pl > Forum > PHP
kukix
Witam.

Mam tablice wygladającą w ten sposób:
Kod
<?
$category=array (
'1_383' =>
array(
'name' => 'Anteny pokojowe',
),
'1_540' =>
array(
'name' => 'Baterie, akumulatory, ładowarki',
'elements' =>
array (
'540_519' => 'Akumulatory',
'540_520' => 'Baterie',
'540_522' => 'Ładowarki akumulatorowe',
),
),
'1_531' =>
array(
'name' => 'Car Audio-Video',
'elements' =>
array (
'531_375' => 'Gło&para;niki samochodowe - do zabudowy',
'531_376' => 'Gło&para;niki samochodowe - kolumny',
'531_382' => 'Samochodowe Akcesoria',
'531_379' => 'Samochodowe radioodtwarzacze',
'531_380' => 'Samochodowe radioodtwarzacze Video',
'531_381' => 'Samochodowe wzmacniacze',
),
),
);


w tablicy tej występuje ponad 600 różnych pól.

Zastanawioam sie, czy można jakoś przyspieszyc operacje na tej tablicy.
Głównie korzystam z foreach() i dalej różne warunki..

Slyszalem, że można zrobic cache tej tablicy w pamięci serwera..
Tablica ta jest praktycznie cały czas niezmienna.. cały czas to samo..

prosze o podpowiedź.
Bede bardzo wdzięczny za wszelką pomoc.
Moli
Do cache możesz użyć serialize i unserialize.
phpion
Może rób cache (twórz pliki trzymane na serwerze) na podstawie tej tablicy? Chodzi mi np. o wygenerowanie menu (bo pewnie to robisz) na podstawie tych danych i zapisanie go do jakiegoś pliku, a potem na stronie bezpośrednie includowanie go.
siemakuba
Możesz spróbować przepisać to bez użycia foreach, bo foreach na swoje potrzeby tworzy sobie kopię tablicy. Tym samym, masz w pamięci dwa duże obiekty.
Ale czy dużo na tym zyskasz - ciężko powiedzieć. Może za dużo i mało optymalnie dzieje się w samym foreach? Dużo tam mielisz te dane?

pozdr.
c3zi
Mozesz zrobic najpierw skrypcik, ktory wygeneruje tobie jakis cache, np. na podstawie klucza( tak beda nazywac sie elementy cache'u ). Mozesz skorzysta z lekkiej PEARowskiej biblioteki: CACHE_LITE.
andrzejb
przemiel tablice wypluj to co chcesz a efekty inc'luduj winksmiley.jpg
kukix
Dzieki chłopaki za odpowiedzi.
No wlaśnie to jest już tablica, którą includuje.
Dane pobieram z bazy sql przerabiam dużym skryptem igeneruje taką tablice, zapisuje ją do pliku.

Skoro foreach laduje jeszcze raz do pamięci to moze wykorzystac do tego " while (list($item,$key) = each($elements)) { }" ?


Jeżeli chodzi o serialize i unserialize to nie rozumie do końca działania tej funkcji. Domyslam sie , że serialize ładuje do pamięci a unserialize czysci pamiec. Tylko to chyba nie o to chodzi. Operacja na tablicy jest przy każdym wywołaniu strony wykonywana tylko raz. tak więc nie ma sensu robic serialize i unserialize jak skrypt tylko raz wykonuje operaxcje na skrypcie. Chodzi mi bardziej o cos takiego jak jest przy sql'u. tzn żeby serwer trzymał tablice w pamieci dla nastepnego wykonania skryptu. chociaż teraz tak sobie mysle, że to raczej niemozliwe.


oto moj kod pracujący na tej tablicy:

Kod
function gen_menu($param_zakladka='', $param_kategoria='') {
  $kod_html='';
  include('include/kategorie.php');
  $q=0;
  if (is_array(@$category)) {
    reset($category);
    foreach ($category as $id=>$n_category){

      $name=$n_category['name'];
      $elements=@$n_category['elements'];
      if (!empty($param_zakladka)) {
        if (!empty($param_kategoria)) { //wyświetlamy tylko z tej kategorii i zakladki
          $param = $param_zakladka.'_'.$param_kategoria;
          if ($id == $param) {
            print ($name.'<br>');
            ////f (is_array(@$elements)) { narazie tak
            //  gen_submenu($elements,1);
            //}
          }
        } else { //wyswietlamy tylko z tej zakladki
          $param = $param_zakladka.'_';
          if (strpos($id, $param) !== false) {
            //print ($name.'<br>');
            $q++;//potrzebne do kodu html
            $kod_html .= gen_menu_html($param_zakladka,$id,$name,$param_kategoria,$q);
          }
        }
      } else { //wyswietlamy wszystkie
        if (!empty($param_kategoria)) { //wyświetlamy tylko z tej kategorii
          $param = '_'.$param_kategoria;
          if (strpos($id, $param) !== false) {
           // print ($name.'<br>');narazie
           // if (is_array(@$elements)) {
           //   gen_submenu($elements,1);
            //}
          }
        } else {
          //print ($name.'<br>');
         // if (is_array(@$elements)) {//narazie
         //   gen_submenu($elements,1);
         // }
        }
      }
    }
  }

  return $kod_html;
}



function gen_submenu($elements=array(),$level) {
        
  while (list($item,$key) = each($elements)) {
    
    if (is_array($item)) {
      // dany element jest drzewem
      $id=key($item);
      $name=$item[$id]['name'];
      $new_elements=$item[$id]['elements'];
      $level++;
      
      $name=addslashes($name);
      
      gen_submenu($new_elements,$level);
      $level--;
    } else {
      // dany element jest lisciem
      $kat_name=$key;                
      $kat_id=$item;
      
      //print('<font color="red">  '.$kat_name.' </font><BR>');  
      $id=$item;
      
    }
  } // end while

  return(0);
}



dzieki wielkie za odpowiedzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.