Tema: Re: q:del masyvu is function
Autorius: Justas Butkus
Data: 2009-10-23 22:23:03
Labas.

PHP puikiai grąžina masyvą tokį, koks suformuotas.

Pirmas dalykas, tai ta funkcija toli gražu nesukuria daugiamačio masyvo, 
kuriame būtų eilutės.
Ta funkcija galėtų veikti kaip nors taip (negerovių joje netrūksta, bet 
juk ne apie tai čia):

function listing() {
   global $link;
   $query_str = 'SELECT * FROM `table`';
   $res = mysql_query($query_str, $link);

   $rows = array();
   while($row = mysql_fetch_array($res, MYSQL_NUM)) {
     $rows[] = $row;
   }
   return $rows;
}



Antras dalykas - sprendimai panaudojimo vietoje:

==== a ====
$row = current($listingas);
while(!empty($row)) {
     var_dump($row);
     $row = next($listingas);
}

==== b ====
array_walk($listingas, create_function('$r, $i', 'var_dump($r);'));

==== c ====
foreach($listingas as $row) {
     var_dump($row);
}



Visi variantai turėtų suteikti tą patį rezultatą.
Klausimas - ką naudoti.
PHP masyvo perėjimui turi funkciją foreach:
http://lt.php.net/manual/en/control-structures.foreach.php

while(<pakeitimo vieta>)
parodytoje vietoje tikrina reiškinio teisingumą.
Kadangi jokie pakeitimai neatliekami, tai while($row = $masyvas) 
visuomet yra teisinga ir spausdina vieną masyvo eilutę amžinai.
while($row = mysql_fetch_array($result))
veikia dėl to, kad po mysql_fetch_array($result) pakeičiamas pats 
$result ir kitą kartą pašaukus mysql_fetch_array rezultatas bus jau kitoks.
mysql_fetch_array galima įsivaizduoti taip:

function my_mysql_fetch_array(&$input) {
     $currentRow = $input[0];
     unset($input[0]);
     return $currentRow;
}
Tuomet, jei paduotume jai masyvą:
$masyvas = array('Geltona', 'Mėlyna', 'Žalia');
while($eilute = my_mysql_fetch_array($masyvas));
po kiekvieno ciklo sumažėtų pats $masyvas kintamasis.

Veikia ne visai taip mysql_fetch_array, reikėtų ir apie objektus 
paskaityti, bet tuo tarpu - kodėl gi ne.

www.php.net ateičiai. ;)

Iš kitos pusės - viską verta patikrinti savomis rankomis.
Pvz. savo atveju galėjai prieš 'return $query' įterpti eilutę 
'print_r($query);' ir būtum pamatęs, kad ten toli gražu ne toks ilgas 
masyvas, kaip manei.



--
JB

Asdf hjkl rašė:
> Sveiki.
> iskilo tokia problema, gal kas uzves ant kelio
> 
> turiu viename faile funkcija
> function listing()
> {
>    $query_string = "
>                              SELECT *
>                              FROM table
>                              WHERE visibility = '0'
>                              ORDER BY name ASC
>                              LIMIT 0, 10
>                              ";
>    $query = mysql_query($query_string);
>    $query = mysql_fetch_array(mysql_query($query_string),MYSQL_NUM);
>     return $query;
> }
> funkcijoje susiformuojamas dvimatis masyvas
> 
> tada kitame faile as naudoju sita funkcija ir bandau issivesti eilutes 
> ir stai cia prasideda bedos
> 
> $listingas = listing()
> 
> while($row = $listingas)
>    {
>        var_dump($row)
>    }
> 
> situ atveju sistema uzsiloopin'a amziname cikle ir isvedineja tik 
> pirmajaja eilute
> jei fetch'inu nefunkcijoje, o darydamas while, tuomet gaunu tik viena 
> masyvo eilute.
> 
> Taip sakant abiem atvejais as nebegaunu dvimacio masyvo, o tik vienmati.
> Kaip taisyklingai grazinti daugiamati masyva is funkcijos?
> 
>