Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SPL] tworzenie iteratora, w miejsce 2 pętli jedna w drugiej
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Odkąd poznałem możliwości SPL jestem pod dużym wrażeniem możliwości podsuwanych tam pomysłow, i coraz częściej staram się z nich korzystać.

Zacząłem stosować iteratory, i rzeczywiście - okazały się w wielu przypadkach bardzo przydatne, zmiejszając ilość (chyba (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) pamięci, którą musi zaalokować pamięć, i przyspieszając jego działanie w wielu przypadkach (mniejsza ilość pętli)

Zastanawiam się jednak, czy istnieje jakiś prosty sposób na tworzenie iteratoró w nieco bardziej złożonych przypadkach.

Zacznijmy od jakiegoś prostego przypadku. Np. mamy 2 tablice, a potrzebna jest nam jedna, w której znajdują się wszystkie kombinacje elementów z tych 2 powyższych (czyli każdy z każdym).
Normalnie rozwiązanie bardzo proste.
Dwa foreach, jeden drugim, i generowanie tablicy wynikowej.
  1. <?php
  2.  
  3. $aOwoce = array( 'jabłko', 'banan', 'wiśnia' );
  4. $aKolory = array( 'niebieski', 'czerwony' );
  5. $aWynik = array();
  6. foreach( $aOwoce as $sOwoc ){
  7.  foreach( $aKolory as $sKolor ){
  8. $aWynik[] = $sKolor . ' '. $sOwoc ;
  9. }
  10. }
  11. ?>


Jednak w ten sposób przechowujemy całą tą tablicę zupełnie niepotrzebnie, bo tak naprawdę do dalszego działania programu będziemy potrzebowali 1, kolejny jej element w danym momencie....
Oczywiście - nawet na chłopski rozum można napisać odpowiedni iterator, wymaga jednak całkiem złożonego algorytmu sprawdzania kolejnych elementów i ich zwracania.
A problem wydaje mi się na tyle standardowy, że powinny być jakieś "standardowe" rozwiązania - chyba że mam po prostu zaćmę i czegoś oczywistego nie udało mi sie dotychczas zauważyć... (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

// ps. i nie próbujcie mi odpowiedzieć, że są jakieś standardowe funkcje do łączenia tablic, bo normalnie ... zamorduję (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
antao
post
Post #2





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 8.02.2005

Ostrzeżenie: (0%)
-----


Hello World...

przeprowadzając testy (w pętli : x10 000) wyszło że:

-> system z iteracją: śr. czas wykonania jednej pętli
  1. <?php
  2. foreach( $Element as $iKey => $sWord ) {
  3. echo $iKey . ' => ' . $sWord . '<br />';
  4. }
  5. ?>
wynosi 0,0005207s (pamięć >32MB)

-> pętla
  1. <?php
  2. foreach( $aOwoce as $sWord => $sOwoc ){
  3.  foreach( $aKolory as $iKey => $sKolor ){
  4.  echo $sWord .'=>'. $iKey .' '. $sKolor .' '. $sOwoc .'<br />';
  5. }
  6. }
  7. ?>
śr. czas: 0,0002610s (pamięć >31MB)

tak więc różnica w szybkości wynosi 199,5%... (IMG:http://forum.php.pl/style_emoticons/default/ohmy.gif)

"wąskie gardło" ?
  1. <?php
  2. $this->aFirst = $aFirst;
  3. $this->aSecond = $aSecond;
  4. ?>

z 2 robią się 4... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Cytat
//ps. a jeśli ktoś się zastanawia, czy jest sens tworzenia taiej ilości kodu, zamiast zaprezentowanych powyżej dwóch pętli - niech wyobrazi sobie, że ten iterator nie pracuje na 2 tylko na np. 4 tablicach. I policzy - jakiej wielkości byłaby tablica wynikowa....

z tego co widzę, klasa GenerateNames jest przystosowana do obsługi tylko 2 tablic, czyli żeby obsłużyć np. 4 tablice trzeba klasę znacznie rozbudować ?
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 23:18