Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie rozbudowanego warunku z tablicy wielowymiarowej
Greg0
post 11.07.2012, 18:59:31
Post #1





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

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


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.
Go to the top of the page
+Quote Post
Crozin
post 11.07.2012, 20:43:08
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
Greg0
post 12.07.2012, 19:55:23
Post #3





Grupa: Zarejestrowani
Postów: 264
Pomógł: 54
Dołączył: 31.08.2007
Skąd: Tychy

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


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.

Ten post edytował Greg0 12.07.2012, 20:29:01
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 7.07.2025 - 19:34