Autor Zpráva
capricorn
Profil
Zdravim, zajimalo by mne, jaka z nize uvedenych testu je spravna moznost. Jinak vicerozmerne pole vytvarim pomoci vypisu z db a na objemu se urcite bude zvetsovat, protoze tu funkci budu pouzivat pouze k tvorbe selectu. Ten cyklus slouzi jen k testovani.



$array = array('limit' => array(1 => 1, 20 => 20, 30 => 30, 40 => 40, 50 => 50),
                        'order' => array('asc' => 'Vzestupně', 'desc' => 'Sestupně'));

function test1(&$array){
// tady se sestavi select
}

function test2($array, $nazev){
// tady se sestavi select
}

// test1
$time = microtime(true);
for($i=0;$i<100000;$i++) {
$test1 = test1($array['limit']);
}
echo(microtime(true) - $time) .'<br>';

//test2 
$time = microtime(true);
for($i=0;$i<100000;$i++) {
$test2 = test2($array, 'limit');
}
echo(microtime(true) - $time).'<br>';

ninja
Profil
Vicerozmerne pole se predava uplne stejne jako kazda jina promena. Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci. To se hodi v pripade, ze chcete s danou promenou manipulovat (zejmena jedna li se o objekt).
capricorn
Profil
ninja

Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci.

Chapu to dobre, ze napr. pri 10-ti volani funkce se pouzije puvodni reference?
BetaCam
Profil
capricorn
Chapu to dobre, ze napr. pri 10-ti volani funkce se pouzije puvodni reference?

Ne použije se vždy reference na to co se pošle jako argument funkce.

ninja

Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci.

Jen bych doplnil, že PHP se používá lazy copy pokud se tedy proměnná nemodifikuje nevytváří se její kopie.
capricorn
Profil
BetaCam

Ne použije se vždy reference na to co se pošle jako argument funkce.
Asi jsem unaveny, ale ja to proste nemuzu dostat do hlavy. Neslo by to prosim vysvetlit na nejakem prikladu?
BetaCam
Profil
capricorn
Asi jsem unaveny, ale ja to proste nemuzu dostat do hlavy. Neslo by to prosim vysvetlit na nejakem prikladu?

To by se jistě dalo otázka je co přesně chceš vysvětlit. Pokud ti jde o rozdíl použití reference oproti klasickému předání tak to ukazuje následující příklad :

<?php
error_reporting(E_ALL);

function reference(&$arg){
	$arg[1] = 'modified';
}

function noreference($arg){
	$arg[1] = 'modified';
}

$array = array('jedna', 'dva', 'tri');
$array2 = array(1,2,3);

noreference($array);
var_dump($array);
reference($array);
var_dump($array);
reference($array2);
var_dump($array2);
?>
imploder
Profil
&$prom je ukazatel na proměnnou $prom. Je to stejné jako & v C, jen v PHP není *, hodnota na té adrese pak vystupuje ve funkci pod názvem $prom (bez hvězdičky). Je to jenom na předávání parametrů odkazem místo hodnotou, & se dává jenom do definice funkce, ne do volání. BetaCamův příklad to názorně ukazuje.
capricorn
Profil
BetaCam, imploder

Cetl jsem si to asi hodinu dokolecka dival se na vypis, ale presto me to neni zcela jasne. Jasne me je jen to, co dela prvni volani noreference($array) a druhe volani funkce reference($array), ale to treti volani funkce reference($array2), tomu porad nerozumim. Proc u toho tretiho volani ma hodnotu jen klic 1 a klice 0 a 3 jsou bez hodnot?
Paja
Profil
Pokud použiješ
&$proměnná
pak když uvnitř té funkce něco provedeš s proměnnou, tak se to projeví i mimo funkci .. kdežto
$proměnná
ti vytvoří jenom proměnnou ve funkci (kopii té z okolí funkce), se kterou můžeš dělat co chceš .. dokonce ji smazat .. a venku => v celkovém skriptu se změna neprojeví.
capricorn
Profil
Paja

Porad to nechapu. :-( Tak co bude obsahovat promenna

&$arg


pred volanim
reference($array2);


?
DoubleThink
Profil *
& je operátor reference. Pokud jej dáš před název proměnné, neodešle se do funkce hodnota proměnné, ale její adresa v paměti. Uvnitř funkce se tedy nevytvoří kopie proměnné, ale pracuje se s tou původní.
BetaCam
Profil
capricorn

Tady máš ještě dvě alternativy toho jak "obejít reference". Sice to ne ní zrovna ideální a není to uplně to samé co dělá reference, ale třeba ti to pomůže lépe pochopit problematiku.

<?php
error_reporting(E_ALL);

function reference(&$arg){$arg[1] = 'modified';}
function noreference($arg){$arg[1] = 'modified';}
function useGlobal(){global $globarray; $globarray[1] = 'modified';}
function useReturn($arg){$arg[1] = 'modified'; return $arg;}

$array = array('jedna', 'dva', 'tri');
$array2 = array(1,2,3);

noreference($array);
var_dump($array);
reference($array);
var_dump($array);
reference($array2);
var_dump($array2);

$array = array('jedna', 'dva', 'tri');
$globarray = array('jedna', 'dva', 'tri');

useGlobal();
var_dump($globarray);
$array = useReturn($array);
var_dump($array);
?>


ale to treti volani funkce reference($array2), tomu porad nerozumim. Proc u toho tretiho volani ma hodnotu jen klic 1 a klice 0 a 3 jsou bez hodnot?

Tak teď ti nerozumím.

1) klíč 3 v poli $array2 vůbec není a to ani před voláním funkce reference() ani po ní.
2) klíč 1 je v poli modifikován na hodnotu "modified" ostatním klíčům zůstávají hodnoty stejné.
capricorn
Profil
DoubleThink

& je operátor reference. Pokud jej dáš před název proměnné, neodešle se do funkce hodnota proměnné, ale její adresa v paměti. Uvnitř funkce se tedy nevytvoří kopie proměnné, ale pracuje se s tou původní.
Tohle mne je uz jasne, ale asi si sedim na vedeni, ale nemuzu porad pochopit, proc druhe volani

reference($array2);
var_dump($array2);


vypise

array(3) {
  [0]=>
  int(1)
  [1]=>
  string(8) "modified"
  [2]=>
  int(3)
}


BetaCam

1) klíč 3 v poli $array2 vůbec není a to ani před voláním funkce reference() ani po ní.
Chybicka se vloudila.

2) klíč 1 je v poli modifikován na hodnotu "modified" ostatním klíčům zůstávají hodnoty stejné.
No jo, ale kdyz zustavaji stejne, tak proc maji prazdne hodnoty, viz horni vypis?

Jinak se na mne nezlobte, ze to porad zcela nechapu, ale ja to urcite pochopim, chce to jen cas, protoze dychtim to pochopit.
BetaCam
Profil
capricorn
No jo, ale kdyz zustavaji stejne, tak proc maji prazdne hodnoty, viz horni vypis?

Nemají prázdné hodnoty. Mají hodnoty 1 a 3. Tady nejde o to, že nechápeš druhé volání, ale o to že nechápeš výpis funkce var_dump(). Výpis var_dumpu může být různorodý, ale vždy říká to samé.



Klasický výstup var_dumpu :

array(3){
 [0]=> int(1)
 [1]=> string(8) "modified"
 [2]=> int(3)
}

Upravený výstup var_dumpu :

array
  0 => int 1
  1 => string 'modified' (length=8)
  2 => int 3


Jak vidíš výstup je jiný, ale obojí říká to samé.

když to vemu popořade :
array(3){                       // var_dumpu bylo předáno pole o třech prvcích
 [0]=> int(1)                   // klíč 0 obsahuje hodnotu 1 typu integer
 [1]=> string(8) "modified"     // klíč 1 obsahuje hodnotu modified typu string s délkou 8 znaků
 [2]=> int(3)                   // klíč 2 obsahuje hodnotu 3 typu integer
}


Problém tedy u tebe vyplynul z nepochopení var_dump() výpisu
capricorn
Profil
BetaCam

Problém tedy u tebe vyplynul z nepochopení var_dump() výpisu
Konecne to chapu, mam z toho hroznou radost. ;-) Bylo to tim, ze jsem nepochopil var_dump(), kdybych si to dal do print_r(), tak bych to chapal uz odpoledne, proste des, ale dulezite je, ze jsi byl tak hodny a mel se mnou trpelivost.

Ale kazdopadne dekuji i vsem ostatnim, ale nejvetsi muj dik patri BetaCamovi, ktery si s tim dal praci a nazorne mne vsechno prevedl.

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:

0