⑴ php foreach數組問題
1.
$array=array('1','1');
foreach($array as $k=>$v)
{
$v=200;
}
print_r($array);
在這段代碼,foreach遍歷給定的 array 數組。每次循環中,當前單元的值被賦給 $v,鍵名也會在每次循環中被賦給變數 $k。
這種賦值是一種 「拷貝」 賦值,也就是說,$v 是 array 數組中某個單元的副本,更進一步說,$v 與 array 數組中某個單元,除了值相同之外,沒有其他的關系。因此, $v=200; 這句代碼只是修改了 $v的值,而對array 數組沒任何影響。
其實也就是編程語言中函數參數的「值傳遞」與「引用傳遞」的概念區別。
作為對比,以下的例子可能更易幫助你理解 值傳遞 與 引用傳遞 的區別:
$array=array('1','1');
foreach($array as $k=>&$v) //注意這句,$v前面多了個&
{
$v=200;
}
print_r($array);
運行結果: Array ( [0] => 200 [1] => 200 )
2.
$array=array('1','1');
foreach($array as $k=>$v)
{
$array[$v]=200;
}
print_r($array);的結果為什麼又是Array ( [0] => 1 [1] => 200 ) 呢?
這個也很好理解,雖然你在foreach里遍歷了數組,但你並沒有用 $aray[$k] = 200 來進行賦值,而是用 $v ,
所以,當訪問到第1個元素時,$v = '1',那麼 $array[$v]=200 的執行,實際上也就是, $array['1']=200,也就是第2個元素被改成200。
當訪問第2個元素時,還是 $v = '1',仍舊是 $array['1']=200。
所以 $array 的第2個元素被修改了2次,而第1個元素沒修改過。
提示:在php語言里,數組下標從0開始計數,跟c語言一樣。
⑵ 請說明php中傳值與傳引用的區別.什麼時候傳值什麼
傳值,
是把實參的值賦值給行參
那麼對行參的修改,不會影響實參的值
傳引用
真正的以地址的方式傳遞參數
傳遞以後,行參和實參都是同一個對象,只是他們名字不同而已
對行參的修改將影響實參的值
所謂值傳遞,就是說僅將對象的值傳遞給目標對象,就相當於;系統將為目標對象重新開辟一個完全相同的內存空間。
所謂引用,就是說將對象在內存中的地址傳遞給目標對象,就相當於使目標對象和原始對象對應同一個內存存儲空間。此時,如果對目標對象進行修改,內存中的數據也會改變。
⑶ php引用傳遞中的&什麼意思,有什麼用
其實圖片中的文字已經描述得很詳細了,如果你是循序漸進學到這里的,應該是可以理解的啊。
加了&就是引用傳遞,就是把實參的內存地址傳遞給函數內部的形參,這樣的話函數內部對形參的任何修改都會直接影響到外部的實參,也就是說這種情況下實參和形參其實是同一個變數;
而不加&則是值傳遞,就是把實參的值傳遞給函數內部的形參,這時候函數內部對形參的任何修改都與外部的實參沒有任何關系,不會改變實參的值。
打個比方,值傳遞就好比你給某人100塊錢,然後他拿這錢去不管怎麼花都與你無關了;而引用傳遞則好比你把自己的銀行帳號密碼都告訴某人,那麼他此後用這賬號所做的任何消費行為都與你的總資產息息相關了!
⑷ PHP中按值傳遞和引用傳遞的區別
(1)按值傳遞:函數范圍內對值的任何改變在函數外部都會被忽略
(2)按引用傳遞:函數范圍內對值的任何改變在函數外部也能反映出這些修改
(3)優缺點:
A:按值傳遞時,php必須復制值。特別是對於大型的字元串和對象來說,這將會是一個代價很大的操作。
B.按引用傳遞則不需要復制值,對於性能提高很有好處。
<?php
header('content-type:text/html;charset=utf-8');
//探討一下array,null,對象,資源的默認傳遞方式
//結論(1)array默認是值傳遞,通過加&可以引用傳遞
//(2)null默認是值傳遞,通過加&可以引用傳遞
//(3)資源是值傳遞.通過加&可以引用傳遞
//(4)對象默認也是值傳遞,但是對象值傳遞是對象標識符
$hero=array('no1'=>'蝙蝠俠','no2'=>'超人');
$hero2=&$hero;
$hero2['no1']='蜘蛛俠';
echo'<pre>';
var_mp($hero);
var_mp($hero2);
$a=null;
$b=&$a;
$b='abc';
var_mp($a,$b);
?>
⑸ php中傳值與傳引用的區別
傳值要重新構造一份原參數的拷貝
傳引用則不需要
傳值對參數的修改不會改變原參數
傳引用時可以直接修改原參數
至於什麼時候傳引用,這看你的需要。
如果你的參數對象比較大(佔用內存很多),而函數本身不需要修改原對象時,這個時候就推薦傳引用,可以省去臨時對象的構造開銷。
如果你有實際修改原參數的需要,那麼就只能傳引用了。