Inca un enunt din categoria "practica
individuala" asociata unui curs de PHP procedural:
"1.Sa se scrie o functie cu numar variabil de argumente care afiseaza valorile argumentelor primite sub forma unei liste HTML.
Ex: f(1,2,3) va afisa un bulleted (unordered) list cu valorile 1, 2 si 3);2. Aceeasi cerinta ca mai sus, dar functia va afisa argumentele ordonate crescator.3. Aceeasi cerinta, dar functia va avea un prim argument obligatoriu, care specifica sensul ordonarii (crescator sau descrescator)."
Intrucat ultima cerinta la inglobeaza pe
anterioarele, solutia propusa o va trata pe aceasta din urma.
S-a definit functia funcTest($asc), care poate fi apelata cu un numar n>= 1 oricat
de mare de argumente, apelarea fara argumente generand warning.
In corpul lui funcTest(…) este apelata functia
predefinita func_num_ags(). Aceasta
intoarce numarul de argumente pasate functiei funcTest(…). Daca numarul este
mai mare decat 1, este apelata o alta functie predefinita, func_get_args(), care
intoarce ca rezultat un array cu argumentele pasate.
In continuare, este afisata lista cu argumente
nesortate apoi se trece la sortarea acestora cu bubble sort, sensul
sortarii fiind stabilit pe baza parametrului $asc(0 = crescator, 1 = descrescator). Pentru o duplicare mai
redusa a codului, au fost definite functiile ascSort(…) si descSort(…), apelate
din funcTest(…) in vederea sortarii efective. Doi din trei parametri sunt transferati prin referinta intrucat se doreste modificarea variabilelor respective: $count, care semnaleaza prezenta inversiunilor intre elementele listei de argumente, si, respectiv, $arr, tabloul care stocheaza argumentele.
funcTest(…) este apelata prima data cu valorile unui
array initializat pseudoaleator, apoi direct cu apeluri ale functiei rand() plasate in lista de argumente.
Codul si prinscreenul:
<!DOCTYPE HTML>
<html>
<head><title>VarArgFunc2.0</title></head>
<body style =
"background-color:yellow;color:DarkOrchid">
<ul><h3>
<?php
function funcTest($asc)
{
$nr
= func_num_args();
if($nr
> 1) $arr = func_get_args();
else
return;
echo
"<br/>The initial unsorted list of arguments:<br/>";
for($i
= 1; $i < $nr; $i++) echo $arr[$i]."; ";
echo
"<br/>---------------------<br/>";
if(!$asc)
{
do
{
$count
= 0;
for($i
= 1; $i < $nr - 1; $i++) ascSort($i, $count, $arr);
}
while($count);
}
else
{
do
{
$count
= 0;
for($i
= 1; $i < $nr - 1; $i++) descSort($i, $count, $arr);
}
while($count);
}
$asc
= ($asc == 0)? "ascending" : "descending";
echo
"<br/>The $asc sorted list of arguments:<br/>";
for($i
= 1; $i < $nr; $i++) echo "<li>$arr[$i]</li>";
}
function ascSort($i, &$count, array &$arr =
NULL)
{
if($arr[$i]
>= $arr[$i + 1])
{
$count
= 1;
$temp
= $arr[$i];
$arr[$i]
= $arr[$i + 1];
$arr[$i
+ 1] = $temp;
}
}
function descSort($i, &$count, array &$arr =
NULL)
{
if($arr[$i]
<= $arr[$i + 1])
{
$count = 1;
$temp
= $arr[$i];
$arr[$i]
= $arr[$i + 1];
$arr[$i
+ 1] = $temp;
}
}
$asc = rand(0, 1);
$arg = array();
for($i = 0; $i < 5; $i++) $arg[] = rand(0, 100);
funcTest($asc, $arg[0], $arg[1], $arg[2], $arg[3],
$arg[4]);
echo
"<br/>---------------------<br/>";
funcTest($asc, rand(0, 100), rand(0, 100), rand(0,
100), rand(0, 100), rand(0, 100), rand(0, 100));
echo
"<br/>---------------------<br/>";
funcTest($asc);// nu afisaza nimic
//funcTest(); genereaza warning in absenta
argumentului obligatoriu
?>
</h3>
</ul>
</body>
</html>
No comments:
Post a Comment