Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sprawdzanie ilości stałych w argumencie funkcji
VRK
post 5.03.2011, 15:31:12
Post #1





Grupa: Zablokowani
Postów: 6
Pomógł: 0
Dołączył: 18.12.2008

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


Witam wszystkich!
Stworzyłem klasę (nazwijmy ją "foo") i umieściłem w niej 8 stałych o różnych wartościach.
Potrzebne są one, aby poprawnie działała funkcja (powiedzmy "bar"):
  1. <?php
  2. class foo
  3. {
  4. const C1 = 0;
  5. const C2 = 1;
  6. const C3 = 2;
  7. const C4 = 4;
  8. const C5 = 8;
  9. const C6 = 16;
  10. const C7 = 32;
  11. const C8 = 64;
  12.  
  13. public static function bar($type, $key)
  14. {
  15. // Funkcja bar
  16. }
  17. }
  18. ?>


Funkcja w zależności od podanych stałych ma przeszukiwać różne tablice w poszukiwaniu odpowiedniego klucza.
Problem zaczyna się w momencie, gdy chcę przeszukać wiele tablic jednym poleceniem:
  1. <?php
  2. $value = foo::bar(foo::C1 | foo::C3 | foo::C7, 'example_key');
  3. ?>


Problem tkwi w tym, że chciałbym, aby funkcja w przypadku podania jednej stałej w argumencie, zwracała pojedynczą zmienną, a w przypadku podania kilku, tablicę wyników.
Do tego muszę znaleźć sposób na rozpoznanie, czy została podana jedna, czy wiele stałych.

Czy znacie jakiś sposób, aby to sprawdzić? Z góry dziękuję za wszystkie odpowiedzi.

Ten post edytował VRK 5.03.2011, 15:40:04
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Fifi209
post 5.03.2011, 15:50:00
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


func_num_args
func_get_args


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
VRK
post 5.03.2011, 15:56:09
Post #3





Grupa: Zablokowani
Postów: 6
Pomógł: 0
Dołączył: 18.12.2008

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


@fifi209
Nie, tak to nie działa tongue.gif
U mnie działa to tak, że kilka stałych jest podawanych w jednym argumencie smile.gif
Gdyby dało się to rozwiązać w tak prosty sposób, to bym nie tworzył tematu tongue.gif
Go to the top of the page
+Quote Post
Fifi209
post 5.03.2011, 15:59:01
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Czyli przekazujesz je w tablicy ;]

Jaki problem sprawdzić jej długość?
count


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
VRK
post 5.03.2011, 16:18:04
Post #5





Grupa: Zablokowani
Postów: 6
Pomógł: 0
Dołączył: 18.12.2008

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


@fifi209
Zobaczyłeś przynajmniej jak wygląda przykład?

  1. <?php
  2. $value = foo::bar(foo::C1 | foo::C3 | foo::C7, 'example_key');
  3. ?>


"|" to "OR" w operacjach bitowych.
Jak można zauważyć, kolejne stałe mają wartości potęg liczby 2.
Dzięki temu mogę na nich przeprowadzać operacje bitowe i tworzyć całe wyrażenia określające, co ma być przeszukiwane.
Go to the top of the page
+Quote Post
Crozin
post 5.03.2011, 16:29:30
Post #6





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

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


Przede wszystkim... nie powinieneś robić czegoś takiego. Takie "triki" strasznie utrudniają późniejsza pracę z kodem, bo zaczyna on działać nieprzewidywanie. Lepiej utwórz sobie drugą metodę, która zwróci tylko jeden element:
  1. public function bar($type, $key) {
  2. return array(...);
  3. }
  4.  
  5. public function singleBar($type, $key) {
  6. return current(self::bar($type, $key));
  7. }
Interfejs klasy / obiektu jest wtedy znacznie czytelniejszy i prostszy w zrozumieniu (pomimo dodania nowej metody).

Jeżeli jednak bardzo chciałbyś zrobić to po swojemu to wystarczy sprawdzić czy przekazana wartość ($type) to któraś z konkretnych zadeklarowanych stałych - jeżeli tak, zwracasz jedno, jeżeli nie to oznaka, że masz do czynienia z wieloma elementami.
Go to the top of the page
+Quote Post
VRK
post 5.03.2011, 16:43:11
Post #7





Grupa: Zablokowani
Postów: 6
Pomógł: 0
Dołączył: 18.12.2008

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


@Crozin
Dzięki. Działa inaczej niż chciałem, ale działa dobrze smile.gif
Go to the top of the page
+Quote Post
Bags_Bunny
post 6.03.2011, 01:23:35
Post #8





Grupa: Zarejestrowani
Postów: 262
Pomógł: 39
Dołączył: 12.04.2004

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


Sprawdzić możesz logarytmem binarnym. Jeśli zwróci wartość całkowitą, to podana została tylko jedna stała. Nie zapomnij o szczególnym przypadku dla zera.


--------------------
rm -rf /*
Go to the top of the page
+Quote Post
kiler129
post 6.03.2011, 02:09:24
Post #9





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Złośliwie dodam, że tak właśnie wygląda kod pisany przez matematyków Lkingsmiley.png


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Crozin
post 6.03.2011, 02:19:31
Post #10





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

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


Cytat
Złośliwie dodam, że tak właśnie wygląda kod pisany przez matematyków
Co niby mają do tego matematycy? Jaki to w ogóle ma związek z matmą?
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: 19.07.2025 - 06:49