Autor Zpráva
BedyR
Profil
Dobrý,
chtěl jsem se zeptat zda je možné vkládat programově do různých funkcích i různé množství argumentů.

pro lepší pochopení mého dotazu předkládám příklad:

<?php
  function func1($arg1=0,$arg2=0,$arg3=0,$arg4=0) {
    return $arg1+$arg2+$arg3+$arg4;
  }
  function func2($arg1=1,$arg2=1,$arg3=0,$arg4=0) {
    return ($arg1/$arg2)+($arg3*$arg4);
  }
  function func3($arg1=0,$arg2=0,$arg3=1,$arg4=1) {
    return ($arg1*$arg2)+($arg3/$arg4);
  }
  function func4($arg1,$arg2,$arg3,$arg4,$arg5) {
    return (($arg1*$arg2)/$arg5)+($arg3/$arg4);
  }
  $pro1 = 100; $pro2 = 5; $pro3 = 10; $pro4 = 2; $pro5 = 7;

  $prop1 = "pro1,pro2,pro3,pro4";
  $prop2 = "pro1,pro3,pro4,pro5";
  $prop3 = "pro1,pro2,pro3,pro5";
  $prop4 = "pro1,pro2,pro3,pro4,pro5";

  for ($x=1;$x<4;$x++) {
    $naz = "func".$x;
    // verze s pevným počtem argumentů
    list($val1,$val2,$val3,$val4) = explode(',',${"prop".$x});
    echo $naz(${$val1},${$val2},${$val3},${$val4})."<br>";
//-------------------------------------    
// verze s variabilním počtem argumentů např.  kdyby ve for by byla 5 byla by volána funkce func4

    $key = explode(",", ${"prop".$x});
    $argc = "";
    for($y=0;$y<count($key);$y++) { $argc .= ${$key[$y]}.","; }  // pro řetězec hodnot
    for($y=0;$y<count($key);$y++) { $arg["val".$y] = ${$key[$y]}; }  // pro array s hodnotama   

// ale co vložit mezi závorky do funkce aby byli předány argumenty ?  

    echo $naz()."<br><br>";
  }
?>
Tori
Profil
BedyR:
Dají se různé věci, ale co to má vlastně dělat? Řešíte konkrétní zadání, nebo zkoušíte co se všecko dá v PHP napsat?
edit: Každopádně variabilní proměnné se tady dají nahradit asoc.polem. Možná se vám hodí func_get_args a call_user_func_array
BedyR
Profil
Tori:
Diky

call_user_func_array bylo přesně to co jsem hledal.

takže poslední řádek by byl

echo call_user_func_array("func".$x, $arg);

Potřebují volat různé funkce podle parametrů a do těch funkcí vkládat různé množství parametrů z různých zdrojů.
Např. při práci s FPDF.
Teď už je to vyřešeno a ještě jednou díky.
Joker
Profil
BedyR:
Ve většině případů je nejjednodušší řešení mít jeden argument typu pole.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: