Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Łączenie argumentów funkcji
Forum PHP.pl > Forum > PHP
Levabul
stworzyłem klase pack w której znajduje się metoda pack() i unpack(). Niestety niemoge sobie poradzić z prtzekazywaniem nieograniczonej ilości argumentów do funkcji pack. Przedstawiam sposób jak chciałem tego dokonać :
  1. <?php
  2.  
  3. class Pack {
  4.  
  5. public $pack;
  6.  
  7.  
  8. public function __construct($str = false) {
  9. if($str) {
  10. $this -> pack = $str;
  11. }
  12. }
  13.  
  14. public function pack() {
  15. foreach (func_get_args() as $arg) {
  16. $str .= $arg.", ";
  17. }
  18. $str = substr($str, 0, strlen($str)-1);
  19.  
  20. $this -> pack = pack($str);
  21. }
  22.  
  23. public function unpack($strFormat) {
  24. return unpack ($strFormat, $this -> pack);
  25. }
  26. }
  27.  
  28. ?>


Próbuje przy użyciu foreach" title="Zobacz w manualu php" target="_manual, func_get_args" title="Zobacz w manualu php" target="_manual połączyć kolejno pobierane argumenty i zapisać je w zmiennej oddzielając je ."," ale wtedy cała zmienna $str traktowana jest jako jeden argumen. Jak sobie z tym poradzić ?

Pozrawiam.
nospor
Przekazuj do funkcji jeden argument, ktory bedzie tablicą. A do tablciy mozesz wrzucac tyle zmiennych ile ci sie podoba
NuLL
  1. <?php
  2.  
  3. function pack($data)
  4. {
  5. $data=func_get_args();
  6.  
  7. return join(",",$data);
  8. }
  9.  
  10. ?>

O to chodzi ? Jesli nie to w czym problem ?
Levabul
Niestety nadal niedziała sad.gif Wywala się error
Cytat
Warning: pack() [function.pack]: Type n: too few arguments in E:\Programy\WebServ\httpd-users\ss\include.php on line 16

Czyli tak jakby funkcja pack() niezwracała uwagi na przecinki podczas rozdzielania zmiennej $data na poszczegulne argumenty. Oto kod:
  1. <?php
  2. class Pack {
  3.  
  4. public $pack;
  5.  
  6.  
  7. public function __construct($str = false) {
  8. if($str) {
  9. $this -> pack = $str;
  10. }
  11. }
  12.  
  13. public function pack($data) {
  14. $data = func_get_args ();
  15. $data = join (",",$data);
  16. $this -> pack = pack ($data);
  17. }
  18.  
  19. public function unpack ($strFormat) {
  20. return unpack ($strFormat, $this -> pack);
  21. }
  22. }
  23.  
  24. #przyklad
  25.  
  26. $paczka = new pack ();
  27. $paczka -> pack ("nvc*", 0x1234, 0x5678, 65, 66);
  28.  
  29. ?>
nospor
o ile wiem to jesli deklarujesz ze funkcja ma jeden argument, to mozesz jej podac tylko jeden argument. Taki ci nawet wyskakuje error. Czemu nie chcesz tego co ci mowilem? zapodawaj do funkcji jeden argument bedacy tablica. co za roznica?
bregovic
Po kiego grzyba wam to $data w parametrach??
  1. <?php
  2.  
  3. function pack()
  4. {
  5. $data = func_get_args();
  6. return join(',', $data);
  7. }
  8.  
  9. ?>

I po sprawie.
Levabul
@nospor - nie wiem czy do funkcji pack można przekazywać jedną tablice zamiast poszczególnych argumentów.
@bregovic - takie rozwiązanie nic niedaje ponieważ join łączy wszystko w jeden string i niemożna tego wykożystac w funkcji pack jako kilka argumentów

Rozwiązanie otrzymałem na innym forum. Tym czego mi brakowało była funkcja eval tongue.gif

  1. <?php
  2. class Pack {
  3.  
  4. public $pack;
  5.  
  6.  
  7. public function __construct($str = false) {
  8. if($str) {
  9. $this -> pack = $str;
  10. }
  11. }
  12.  
  13. public function pack() {
  14. $s = '';
  15. $tmp = array();
  16. foreach(func_get_args() as $key=>$val) {
  17. $tmp['p'.$key] = $val;
  18. if(!empty($s)) $s .= ',';
  19. $s .= '$p'.$key;
  20. }
  21. extract($tmp);
  22. eval('$this -> pack = pack('.$s.');');
  23. }
  24.  
  25. public function unpack ($strFormat) {
  26. return unpack ($strFormat, $this -> pack);
  27. }
  28. }
  29.  
  30. #przyklad
  31.  
  32. $paczka = new pack ();
  33. $paczka -> pack ("nvc*", 0x1234, 0x5678, 65, 66);
  34. echo $paczka -> pack;
  35.  
  36. ?>


Wiem że mało to wydajne ale trudno ...
Ociu
hm...

A nie można tak:
  1. <?php
  2. public function pack( $array )
  3. ?>

?

pozdrawiam
bregovic
Levabul: Nie rób sobie na złość, nie używaj eval(). Nie zrozumiałem że chcesz użyć argumentów do wywołania innej funkcji. W takim razie użyj call_user_func_array" title="Zobacz w manualu php" target="_manual():

  1. <?
  2.  
  3. class Pack
  4. {
  5. public $pack;
  6.  
  7. public function __construct($str = false)
  8. {
  9. if ($str)
  10. {
  11. $this -> pack = $str;
  12. }
  13. }
  14.  
  15. public function pack()
  16. {
  17. $args = $func_get_args();
  18. $this->pack = call_user_func_array('pack', $args);
  19. }
  20.  
  21. public function unpack ($strFormat)
  22. {
  23. return unpack ($strFormat, $this -> pack);
  24. }
  25. }
  26.  
  27. #przyklad
  28.  
  29. $paczka = new pack ();
  30. $paczka -> pack ("nvc*", 0x1234, 0x5678, 65, 66);
  31. echo $paczka -> pack;
  32.  
  33. ?>
Levabul
@Ociu Pewnie ociu ze do metody można dać jako argument tablicę tyle że ja chcę tę tablice wykorzystać póżniej jako KILKA ARGUMENTÓW w funkcji pack () znajdującej się wewnątrz tej metody tongue.gif

@Bregovic dzięki, sprawdze czy działa wieczorem bo teraz do sklepu musze jechać ... (wydaje mi się że powinno działąć biggrin.gif)
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.