Saturday, January 23, 2016

Limbajul PHP. Functii cu numar variabil de argumente

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