Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Łączenie argumentów funkcji
Levabul
post
Post #1





Grupa: Zarejestrowani
Postów: 197
Pomógł: 0
Dołączył: 11.07.2005

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


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.

Ten post edytował Levabul 9.12.2005, 20:56:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Przekazuj do funkcji jeden argument, ktory bedzie tablicą. A do tablciy mozesz wrzucac tyle zmiennych ile ci sie podoba
Go to the top of the page
+Quote Post
NuLL
post
Post #3





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


  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 ?
Go to the top of the page
+Quote Post
Levabul
post
Post #4





Grupa: Zarejestrowani
Postów: 197
Pomógł: 0
Dołączył: 11.07.2005

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


Niestety nadal niedziała (IMG:http://forum.php.pl/style_emoticons/default/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. ?>


Ten post edytował Levabul 10.12.2005, 14:37:04
Go to the top of the page
+Quote Post
nospor
post
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?
Go to the top of the page
+Quote Post
bregovic
post
Post #6





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

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


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.
Go to the top of the page
+Quote Post
Levabul
post
Post #7





Grupa: Zarejestrowani
Postów: 197
Pomógł: 0
Dołączył: 11.07.2005

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


@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 (IMG:http://forum.php.pl/style_emoticons/default/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 ...
Go to the top of the page
+Quote Post
Ociu
post
Post #8





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




hm...

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

?

pozdrawiam
Go to the top of the page
+Quote Post
bregovic
post
Post #9





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

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


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. ?>
Go to the top of the page
+Quote Post
Levabul
post
Post #10





Grupa: Zarejestrowani
Postów: 197
Pomógł: 0
Dołączył: 11.07.2005

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


@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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

@Bregovic dzięki, sprawdze czy działa wieczorem bo teraz do sklepu musze jechać ... (wydaje mi się że powinno działąć (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) )

Ten post edytował Levabul 11.12.2005, 16:43:05
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 07:35