Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sprawdzanie ilości stałych w argumencie funkcji
Forum PHP.pl > Forum > PHP
VRK
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.
Fifi209
func_num_args
func_get_args
VRK
@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
Fifi209
Czyli przekazujesz je w tablicy ;]

Jaki problem sprawdzić jej długość?
count
VRK
@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.
Crozin
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.
VRK
@Crozin
Dzięki. Działa inaczej niż chciałem, ale działa dobrze smile.gif
Bags_Bunny
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.
kiler129
Złośliwie dodam, że tak właśnie wygląda kod pisany przez matematyków Lkingsmiley.png
Crozin
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ą?
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.