Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie rozbudowanego warunku z tablicy wielowymiarowej
Forum PHP.pl > Forum > PHP
Greg0
Witam. Próbuję zrobić rozbudowany warunek z danych zawartych w tablicy (wiem że przy pomocy eval() takie cuda ale się zaplątałem za bardzo).
Do rzeczy, posiadam taką oto tablicę
Kod
Array
(
    [0] => Array
        (
            [0] => name
            [1] => ==
            [2] => Akurat
        )

    [1] => Array
        (
            [0] => image
            [1] => ==
            [2] => at.gif
        )

)


I potrzebuję zrobić taki oto warunek (zgodnie z tablicą)
  1. if($obj->name == 'Akurat' AND $obj->image == 'at.gif')


W zależności od rozciągłości tablicy warunek też by się powiększał. Jak widać pierwszy wiersz z tablicy to nazwa pola z obiektu, drugi operator, a trzeci wartość pola jaką chcę sprawdzić, a pomiędzy kolejnymi częściami mam AND/&& (jak kto woli).

Zaznaczę że nie mam problemu tego osiągnąć gdyby to była tablica jednowymiarowa i do generacji byłby tylko jednoczęściowy warunek.

Pozdrawiam i liczę na jakąkolwiek pomoc z waszej strony.
Crozin
1. Będziesz potrzebował dynamicznie odwoływać się do różnych właściwości obiektu - tutaj potrzebne Ci będzie ReflectionProperty::getValue().
2. Będziesz potrzebował znać ostateczny wynik warunku, tak więc utwórz sobie zmienną $result z wartością początkową true, oznaczającą poprawnie spełnione warunki.
3. Następnie w pętli, pobierz sobie do tymczasowej zmiennej wartość z obiektu, którą będziesz porównywać (patrz pkt. 1) oraz wrzuć blok switch, który będzie decydować o tym jaką operację porównania wykonać (==, <, >, <=, >=).
4. W blokach case wewnątrz switcha wykonaj porównanie dla danego operatora. Wynik porównania przypisz do zmiennej $result.
5. W pętli, już poza switchem sprawdź czy zmienna $result nie ma przypadkiem wartości false. Jeśli tak, nie ma potrzeby dalszego sprawdzania, ponieważ cały warunek będzie już nieprawdziwy. Przerwij wykonywanie pętli - break.
Greg0
Dzięki, zająłem się rozumowaniem nie w tę stronę. W pętli wrzuciłem jednak coś na ten styl:
  1. eval('$exec = strtolower($row->{$column}) '.$operator[$op].' strtolower($value);');
  2. if ($exec)
  3. {
  4. $result = true;
  5. }
  6. else
  7. {
  8. $result = false;
  9. break;
  10. }


Pozdrawiam.
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.