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
hawk
post
Post #2





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Zawsze możesz sobie napisać iterator drzewek/katalogów, który bazuje na iteracji, nie na rekurencji.

A skoro wszystko i tak bazuje na interfejsach, możesz sobie podpiąć swój iterator w miejsce RecursiveDirectoryIterator, i reszta kodu tego nie zauważy. Chociaż DirectoryFilterDots niestety wymaga RecursiveIterator. Tutaj IMHO Boerger źle to zrobił, bo DirectoryIterator nie implementuje RecursiveIterator. Ale pewnie miał swoje powody.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 10.10.2025 - 15:53