[PHP數組的分類]
按照下標的不同,PHP數組分為關聯數組與索引數組
索引數組:下標從0開始,依次增長;
關聯數組:下標為字符串格式,每個下標字符串與數字的值一一關聯對應(有點像對象的鍵值對)
[關於關聯數組和索引數組]
1、數組中可以同時存在關聯數組和索引數組
array(1,2,3,"one"=>4)
2、數組所有的索引數組如果不加指定,會去掉關聯向,默認增長(即關聯數組不占索引位)
array(1,2,"one"=>4,4,5);//1,2,4,5的索引--->0/1/2/3
3、如果關聯數組的key;是純十進制整數字符串,則會將此數字轉化為索引數組的索引值("10.0"/"08"等格式,仍然為關聯數組,不轉為索引)
array(1,2,"on3"=>4,"9"=>4,"010"=>5);//1,2,4的索引--->0/1/9
4、如果手動指定關聯數組的key,索引數組的下標,如果與前面已有的key或下標重復,則后指定的值會覆蓋之前的值; array(1,"one"=>2,0=>5,"one"=>6);-->打印數組 0=>5,"one"=>6;
5、如果手動指定索引數組下標,則后續自增長下標,會按照之前下標最大值,依次增長。
array(1,2,7=>3,4); 1,2,3,4的下標--->0,1,7,8
$arr1 = [1,2,3,4,5,6]//索引數組 var_dump($arr1); print_r($arr1); $arr2 = array("one"=>1,"two"=>2,"three"=>3);//關聯數組 var_dump($arr2); $arr3 = array(1,"one"=>2,3,5=>4,5,6,"9"=>7,8,"haha"=>9); var_dump($arr3);
[數組的聲明方式]
1、直接賦值聲明;
2、[]字面量聲明(PHP5.4版本之后能用)
3、Array()聲明,沒有new關鍵字
//1 $arr[]=1; $arr[3]=1; $arr[9]=1; $arr[4]=1; $arr[7]=1; $arr[]=1; var_dump($arr); //2 $arr = [1,2,3,"one"=>4,6]; var_dump($arr); //3 $arr = array(1,2,3,4,5); var_dump($arr);
[數組元素的讀取]
PHP中數組支持[]和{}讀取下標
$arr = [1,2,3,"one"=>4]; echo $arr[0]; echo $arr["one"]; echo $arr{"one"}; echo $arr{0};
[多維數組]
數組的一個值,依然是一個數組,我們稱這種數組為多維數組
多維數組,不要求所有的項都為數組,可以是數組與普通值的混合
多維數組,也不要求每個子數組的限制個數
使用多維數組,一定要注意,數組中分隔用逗號
原則上,多維數組一般不超過3層使用
$h51701 =array( "gruop1"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), "groupName"=>"一組" ), "gruop2"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男") ), "gruop3"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男") ) ); var_dump($h51701);
遍歷數組
使用for循環遍歷數組
count($arr);用於統計數組元素的個數;
for循環只能用於遍歷純索引數組,!!!如果存在關聯數組,count統計時會統計兩種數組的總個數,使用for循環遍歷混合數組,可能會導致數組越界
$arr = array(1,2,3,5,6,7); $num = count($arr);//count最好放到for外面,可以讓函數只執行一次。 for($i=0;$i<$num;$i++){ echo "{$i}==>{$arr[$i]}"; }
foeEach循環遍歷數組
foreach可以便利任何類型的數組
寫法如下:
$arr = array(1,2,3,"one"=>4,5,6,7); foreach($arr as $item){ echo "{$item}<br/>"; }; $arr = array(1,2,3,"one"=>4,5,6,7); foreach($arr as $key=> $item){ echo "{$key}==>{$item}<br/>"; }
實例
$h51701 =array( "gruop1"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男") ), "gruop2"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男") ), "gruop3"=>array( array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男"), array("name"=>"張三","age"=>14,"sex"=>"男") ) ); foreach ($h51701 as $key => $value) { echo "{$key}<br/>"; foreach ($value as $key1 => $value1) { echo "{$key1}<br/>"; foreach ($value1 as $key2 => $value2) { echo "{$key2}==>{$value2}<br/>"; } } };
3、使用list() each() while()遍歷數組
list():用於將數組的每一個值,賦值給list函數的每一個參數。(list函數的參數,必須小於等於數組的元素個數)。
eg($a,$b,$c)=[1,2,3];-->$a=1; $b=2; $c=3;
注意:①list()在解析數組時,只解析索引數組。
②list可以通過空參數,選擇性的解析數組的值
list($a,,$b)=[1,2,3]--->$a=1,$b=3
each():用於返回數組當前指針所在位的鍵值對,並將指針后移一位。
返回值:如果數組由下一位,返回一個數組。包含一個索引數組(0-鍵,1-值)和一個關聯數組("key"-鍵,"value"-值);如果指針沒有下一位,返回false
[使用list()/each()/while()配合遍歷數組]
while(list($key,$value)= each($arr)){ echo "{$key}-->{$value}<br/>"; }; reset($arr);
數組使用完each()遍歷完一遍后,指針始終處於最后一位的下一位,即再用each(),返回false
$arr = [1,2,3,4,5,6]; list($a,$b,$c,$d,$e,$f) = $arr;
echo "a-->{$a}<br/>";
echo "b-->{$b}<br/>";
echo "c-->{$c}<br/>";
echo "d-->{$d}<br/>";
echo "e-->{$e}<br/>";
echo "f-->{$f}<br/>";*/
while($a = each($arr)
① each($arr) 返回數組或false‘
② 把數組或false賦值給$a
③ while判斷$a如果是數組,繼續執行下一次、
如果$a是false,終止循環
while($a = each($arr)){ echo "{$a[0]}-->{$a[1]}<br/>"; echo "{$a['key']}-->{$a['value']}<br/>"; } while(true){ $a = each($arr); if($a){ echo "{$a[0]}-->{$a[1]}<br/>"; echo "{$a['key']}-->{$a['value']}<br/>"; }else{ break; } } while(list($key,$value)= each($arr)){ echo "{$key}-->{$value}<br/>"; }; reset($arr); while(list($key,$value)= each($arr)){ echo "{$key}-->{$value}<br/>"; }
4、使用數組指針遍歷數組
①next():將數組指針后移一位,並返回后一位的值,沒有返回false
②prev():將數組指針前移一位,並返回前一位的值,沒有返回false
③end():將數組指針移至最后一位,並返回最后一位的值,空數組返回false
④reset():將數組指針恢復到第一位,並返回第一位的值。空數組返回false
⑤key():返回當前指針所在位的鍵;
⑥current():返回當前指針所在位的值;
$arr = [1,2,3,4,"one"=>5]; while(true){ echo key($arr); echo current($arr); echo "<br/>"; if(!echo next($arr)){ break; } } reset($arr); do{ echo key($arr); echo current($arr); echo "<br/>"; }while(echo next($arr)); reset($arr)
[超全局數組]
超全局數組,超全局變量、預定義數組、預定義變量說的都是他。
PHP給我們提供了一組包含強大功能的超全局數組,可以再任何地方,任何作用域不許聲明,直接使用,不受任何作用域限制。
1 服務器變量: $_SERVER
2 環境變量:$_ENV
3 HTTP GET變量:$_GET
4 HHTP POST變量:$_POST
5 request變量:$_REQUEST
6 HTTP文件上傳變量:$_FILES
7 HTTP Cookies:$_COOKIE
8 Session變量:$_SESSION
9 Global變量:$GLOBALS
1服務器變量: $_SERVER
$_SERVER是返回包含瀏覽器頭信息,路徑、腳本以及服務器系統等信息
var_dump($_SERVER); var_dump($_SERVER{'HTTP_USER_AGENT'});
2 環境變量:$_ENV
將系統環境變量,轉變為PHP中的數組,就是$_ENV;
PHP默認是關閉此全局數組的。如需使用,需修改php.ini文件中的variables_order = "GPSC",改為variables_order = "EGPSC";
但是,修改后會有系統性能損失,官方並不推薦使用
可以使用getenv()函數取代全局變量,取出每個系統環境變量的值
phpinfo();函數:包含了有關PHP的各種信息,其中Environment板塊是系統環境變量,可以使用getenv()取出其中的每一個值;
phpinfo(); echo getenv("System");
3 HTTP GET變量:$_GET
獲取前台通過Get方式提交的數據;
var_dump($_GET); if(isset($_GET["submit"])){ if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){ echo "登陸成功"; }else{ echo "登陸失敗"; } }
4 HHTP POST變量:$_POST
獲取前台通過POST提交的數據
if(isset($_POST["submit"])){ if($_POST["username"]=="111"&&$_POST["pwd"]==111){ echo "POST登陸成功"; }else{ echo "POST登陸失敗"; }; }
var_dump($_POST);
5 request變量:$_REQUEST
包含了$_POST,$_GET和$_COOKIE的數組
由於request同時包含get和post,可能導致get與post鍵的沖突,並且效率也不高,所以,並不使用request。
var_dump($_REQUEST);
6 HTTP文件上傳變量:$_FILES
7 HTTP Cookies:$_COOKIE
取到頁面中的cookie信息
setcookie("cookie","haha"); $_COOKIE["hehe"]="haha"; var_dump($_COOKIE);
8 Session變量:$_SESSION
取到保存在Session中的信息
session_start(); $_SESSION["haha"]="hehe"; var_dump($_SESSION);
9 Global變量:$GLOBALS
$GLOBALS包含了上述8個全局數組,可以通過$GLOBALS["_SERVER"]收到$_SERVER
還可以通過給$GLOBALS數組追加下標,創建全局變量,可以再函數里函數外隨意訪問:
$GLOBALS["name"]="zhangsan"; var_dump($GLOBALS);
返回數組所有的值,返回數組
var_dump(array_values($arr));
返回數組所有的鍵,返回數組
var_dump(array_keys($arr));
數組中是否包含某個值,返回真假
參數:需要查詢的值,數組,true(===)/false(==)
var_dump(in_array(8, $arr,true));
交換數組中的鍵和值,返還新數組
var_dump(array_flip($arr));
反轉數組,返回新數組
參數:①需要反轉的數組
②true:保留原有索引數組的下標與值的匹配
false:只反轉值,鍵不保留。默認。
無論true/false都不會影響關聯數組,關聯數組總會保留,鍵值永遠是一對。
var_dump(array_reverse($arr,true));
統計數組元素個數
count($arr);
統計數組中,所有值出現的次數,返回一個新數組
新數組格式:建--> 元數組的值(去重 后的值)
值--> 元數組對應的值出現的次數
var_dump(array_count_values($arr));
$arr = array(1,2,3,4,5,6,"a"=>7,"b"=>8,"c"=>9,10); $arr1 = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP'); $arr2 = array();
1、有一個空數組arr2,鍵-->原數組去重的值,值-->原數組每個值出現的次數。
2、遍歷原數組arr1,並去除arr1中的每一個值。
3、檢測新取出的這個值,是否在arr2中,有一個同名的鍵。
如果有:說明找到了與現在新數組想重復的值,那么就把arr2中的這個鍵對應的值+1
如果沒有:說明截止現在,還沒有與新取值重復的項,那么就在arr2中 新建一個同名的鍵,讓值為1;
foreach($arr1 as $key1 => $value1) { $isHas = false; foreach($arr2 as $key2 => $value2) { if($key2 == $value1) { $rarr2[$value1]++; $isHas = true; } } if(!isHas) $arr2[$value1] = 1; }
移除數祖中重復的值
var_dump(array_unique($arr));
過濾數祖中的每一個值
①不傳回調函數,過濾掉所有的空值,(0/""/false/"0"/[])
②傳回調函數,需要給回調函數傳遞一個參數,判斷參數是否符合要求,如果符合,return true;否則,return false;
var_dump(array_filter($arr,function($num){ if($num>4){ return true; }else{ return false; } }))
通過回調函數,對數組的每一給值進行處理操作。直接修改原數組並返回bool類型的是否成功
執行時,會給回調函數傳遞兩個參數,分別是數組的value,key。然后可以再回調函數中,對值和減進行處理。
但是!!!牽扯到修改值的時候,必需要傳遞地址!!!
$fruits = array("a"=>"lemon","b"=>"orange","c"=>"apple"); var_dump(array_walk($fruits,function(&$item,$key){ echo "{$key}-->{$item}<br/>"; $item =$key; },"10")); var_dump($fruits);
將數組的每個值,交由回調函數進行映射處理
array_map();第一個參數是一個回調函數,第二個參數起是>=1個數組
有幾個數組可以給回調函數傳幾個參數,表示每個數組的一個value;
可以對value進行處理,處理完以后通過return返回,那么新數組的對應的值就是return回去的值
【array_map與array_walk的異同】
相同點:都能遍歷數組,通過回調函數,重新處理數組的每一個值
不同點:
①walk只能傳一個數組,回調函數接受這個數組的值和鍵
map可以傳多個數組,回調函數接受每個數組的值
②walk直接修改原數組,而map不修改原數組,將新數組返回;
③walk可以給回調函數傳遞一個其余參數,map只能傳數組的值
④處理方式上,walk如果需要改掉原數組的值,需在回調函數中傳遞地址,直接修改變量的值;
map是通過將新的值,用return返回,即可修改新數組的值
$a = [1,2,3,4,5]; $b = [1,2,3,4]; $arr2 = array_map(function($value1,$value2){ return $value1+$value2; },$a,$b); var_dump($arr2);
sort -- 對數組排序(升序),可傳入第二個參數,控制以何排序,第二個參數傳1,表示按照數字排序,2表示按字符串排序,自動檢測
rsort -- 對數組逆向排序(降序)
usort -- 使用用戶自定義的比較函數對數組中的值進行排序
usort($arr,function($a,$b){
//return $a-$b;升序
//return $b-$a;降序
});
下述3個函數,常用於(關聯數組排序),用法同上
asort -- 對數組進行排序並保持索引關系
arsort -- 對數組進行逆向排序並保持索引關系
uasort -- 用戶自定義的比較函數對數組進行排序並保持索引關聯
ksort -- 對數組按照鍵名排序
krsort -- 對數組按照鍵名逆向排序
uksort -- 使用用戶自定義的比較函數對數組中的鍵名進行排序
自然排序 :數字按照0-9,字母按照a-z進行排序
下面兩個函數,都是按照自然排序,並且排序時會保留鍵值關聯
natsort -- 用“自然排序”算法對數組排序
natcasesort -- 用“自然排序”算法對數組不區分大小寫字母排序
array_multisort -- 對多個數組或多維數組進行排序
第一個參數時第一個數組,
之后都是可選參數,SORT_ASC - 按照上升順序排序 /SORT_DESC - 按照下降順序排序 ,SORT_NUMERIC - 將項目按照數字比較/SORT_STRING - 將項目按照字符串比較 、
在之后,就是多個可選數組。
排序規則:先排第一個數組,之后的數組,按照與第一個數組對應的關系:一列一列的移動!!!
如果對多個數祖排序,需保持多個數組長度一致,否則會報警告。
$arr = array[1,2,5,7,9,13,18]; echo SORT_STRING; sort($arr,SORT_STRING); usort($arr,function($a,$b){ //return $a-$b;升序 //return $b-$a;降序 }); var_dump($arr);
$arr1 = [1,2,3,4,5,6,7]; $arr2 = [3,5,6,7,8,1,0]; array_multisort($arr1,SORT_DESC,SORT_NUMERIC,$arr2); var_dump($arr1); var_dump($arr2);
$arr = array[1,2,3,4,5,6,"one"=>7,8,9,"haha"]; array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
①數組,必須
②從第幾位開始截取,必選,負數表示,從右邊數第幾位(按照數組的默認順序,包括關聯,索引,而不是按照下標)
③截取的長度,可選,默認,截到最后
④Boolean類是否保持鍵值關聯,可選,默認,索引重新排序,傳true保持索引關聯
$arr1 = array_slice($arr,2,5); var_dump($arr1);
array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
返回值:被刪掉的數組;
參數:
①數組的地址,會修改原數組
②從第幾位開始刪,替換
③刪除或替換的長度
④為空,表示刪除操作,傳入內容,表示替換操作的新值
$arr = array[1,2,3,4,5,6,"one"=>7,8,9,"haha"]; $arr1 = array_splice($arr,4,5,[0,0,0,0]); var_dump($arr1); var_dump($arr);
array_combine — 創建一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
array_combine(作為鍵的數組,作為值的數組)
兩個數組必須保持一致,否則警告,返回false;
$arr1 = [1,2,3,4,5]; $arr2 = [6,7,8,9,0]; $arr3 =array_combine($arr1, $arr2); var_dump($arr3);
合並數組
array array_merge ( array $array1 [, array $... ] )
合並多個數組,將后面的數組拼接到前面的數組的后面
如果多個數組中,出現同名的關聯鍵值,則后面的會覆蓋前面
$arr1 = [1,2,3,"a"=>4,"10"=>5]; $arr2 = [6,7,8,"a"=>9,"10"=>0]; $arr3 = array_merge($arr1,$arr2); var_dump($arr3);
數組取交集
array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
*多個數組取交集,結果會保留第一個數組的鍵值關聯匹配。
$arr1 = [1,2,9,"a"=>4,5]; $arr2 = [6,7,8,"a"=>9,"10"=>5]; $arr3 = array_intersect($arr1, $arr2); var_dump($arr3);
數組取差集
array array_diff ( array $array1 , array $array2 [, array $... ] )
取出多個數組中,在第一個數組中包含,但是在其他數組中不包含的值,保留第一個數組的鍵值關聯
$arr1 = [1,2,9,"a"=>4,5]; $arr2 = [6,7,8,"a"=>9,"10"=>5]; $arr3 = array_diff($arr1, $arr2); var_dump($arr3);
array_pop 刪除數組的最后一個值,並且返回這個值
array_push 數組的最后,放入1-多個值,返回處理之后的數組元素個數
array_shift 刪除數組的第一個只,並且返回這個值
array_unshift 數組的開頭,放入1-多個值,返回處理之后的數組元素個數
array_rand:隨機抽取數組中的1到多個鍵名,第二個參數為空,表示抽一個,傳入數字,表示抽N個。
$arr1 = [1,2,3,4,5,6,7]; var_dump(array_rand($arr1,3));
shuffle:隨機打亂數組順序,直接修改原數組
$arr1 = [1,2,3,4,5,6,7]; shuffle($arr1); var_dump($arr1);
[函數的聲明與使用]
1、函數名是標志符之一,只能有字母,數字,下划線,開頭不能使數字
函數名的命名:須符合小駝峰法則,:myNameIsJh my_name_is_jh
函數名不區分大小寫,func(); FUNC(); Func();
函數名不能與已有函數名重復,,不能與系統函數名重復
2、function_exists("func");用於函數是否以聲明
注意:傳入的函數名,必須是字符串格式,返回的結果為true/false;
[PHP中變量的作用域]
1、局部變量:聲明在函數內的變量,稱為局部變量,只能在函數內部使用,函數外部如需使用,需在函數中使用return關鍵字返回。
2、全局變量:聲明函數外部的變量,稱為全局變量。
3、函數中,使用變量。默認使用內部局部變量,如果,需在函數中使用全局變量,需要使用global關鍵字,將全局變量引入函數,才能使用
函數中的變量名:如果與全局變量重復,global語句之上,為函數局部變量。global語句之下,為系統全局變量
4、$GOLBALS[]全局數組
$GOLBALS[]數組,是PHP給我們內置的全局數組,可以直接給數組添加值,無論寒暑內外聲明,均可在任何地方直接使用
$GLOBALS["a3"]=40; echo $GLOBALS["a3"]; //任何位置直接使用
5、函數中使用全局變量還有一種方式,通過給函數傳參,可以在函數內部使用全局變量
但是,傳遞以后的參數勢函數的局部變量,內部改變,外部不會變。
除非。傳遞的參數是地址 function func($a1,$a2){}// 函數內部修改a1,則全局a1不會變,函數內部修改a2,則全局a2會變。
如果函數的形參,出現了取址符號,則調用函數時,實參必須是變量,而不能使自變量,例如func($a1,$a2);√ func($a1,2);×
6、使用require與include包含不會影響作用域
[靜態變量]
1、靜態變量使用static關鍵字聲明, static $num=1;
2、靜態變量的特點:靜態變量在函數的第一次加載的時候進行聲明,函數使用完不會立即釋放靜態變量,靜態變量在整個腳本過程中,只會聲明一次。
同一函數,多次調用,共享同一個靜態變量。
[函數的參數傳遞]
0、在PHP中,設計參數傳遞時,實參列表只能
1、常規參數傳遞 function func($a){} func($a);
2、引用參數傳遞 function func(&$a){} func($a);
① 通過&引用參數傳遞,函數內修改變量,函數外同步變化
② 形參為引用參數,實參只能是變量,不能是自變量 func(10);
3、默認參數:function func($a=10,$b){}; func(20);//$a的量不變,默認為10;$b必須賦值,否則就會未定義報錯。
function func($b,$a=10){return $a+$b;} func(30);
如果參數中既有默認參數,又有非默認參數,那么。默認參數要在非默認參數的后面,及調用是,要保證非默認參數列表的先賦
4可變參數列表:由於PHP實參可以比形參多,那么我們可以傳遞n個實參,並通過PHP內置參數取到對應參數
var_dump(func_get_args());//區所有參數列表
var_dump(func_num_args());//返回參數的總個數
var_dump( func_get_arg());//根據下標。取每個參數
[變量函數]
1、將一個函數名,轉為字符串后,賦給一個變量,這個變量,就是我們所說的變量函數,可以加()調用函數,
function func(){}--->$fun = "func"--->$func()
[回調函數]
1、使用變量函數,自定義回調函數
function func($func){$func();} -->function f(){};-->func("f");
2、使用call_user_func_array和call_user_func自定義回調函數
兩個函數的第一個參數,均為回調函數,表示執行當前回調
不通電在於:call_user_func_array()第二個參數維數組,並將數組的每一個值賦給回調函數的參數列表,,相當於JS中的apply();
而:call_user_func() 是將回調函數的參數列表,直接展開寫到第二個到多個參數中,相當於JS中的call(); eg:call_user_func_array("func",array(1,2,3));-->func(1,2,3)
call_user_func("func",1,2,3);-->func(1,2,3)
// 簡單的函數聲明 function func(){ echo "jianghao"; } func(); FUNC(); // 檢測函數是否存在 var_dump(function_exists("func")); //變量的作用域 $a1=10; $haha1=20; $haha2 = 20; $GLOBALS["a3"]=40; function func($haha1,&$haha2){ $a1 = 30; echo "0.{a1}<br/>";//global之上使用局部變量 echo $GLOBALS["a3"]."<br/>";//使用$GLOBALS["a3"]數組 $GLOBALS["a4"]=50; global $a1; $a2 =20; echo "1.{a1}<br/>";//global之下使用全局變量 echo "2.{a2}<br/>"; //使用函數內部局部變量 $haha1=20;//是通過全局haha1賦值而來 $haha2 = 30;//是通過全局haha2賦地址而來 return $a2; } $a2 = func($haha1,$haha2); echo "3.{a1}<br/>";//使用全局變量 echo "4.{a2}<br/>";//通過return返回,通過變量接受 echo "5.{$GLOBALS["a4"]}<br/>";//函數中使用$GLOBALS[]聲明,函數外使用。 echo "6.{$haha1}<br/>";//形參為傳值,函數內改變,全局不變 echo "7.{$haha2}<br/>";//形參為傳地址,函數內改變,全局也變
靜態變量
function func(){ static $num = 0; $num++; echo $num."<br/>"; } func();
常規參數傳參
功能:將傳入的參數,+10后返回
Number func(Number params) function func($a){ $a +=10; return $a; } echo func(10);
引用類型參數
function func(&$a){ $a +=10; } func($a); //通過取值符號,可以直接將傳入的$a的之改掉 echo $a;
默認參數
function func($b,$a=10){ return $a+$b; } func(30);
可變參數列表
function func(){ $arr =func_get_args(); var_dump(func_get_args());//區所有參數列表 var_dump(func_num_args());//返回參數的總個數 var_dump( func_get_arg());//根據下標。取每個參數 var_dump(&arr[0]);//同上 for($i=0;$i<func_num_args();$i++){ $num = func_num_args($i) } return $sum; } echo func(1,2,3,4,5);
變量函數
function func($a){ echo "傑瑞教育!{$a}<br/>"; } func(); $fun = "func"; $fun(20); //自定義回調函數 function func($start,$end,$func){ for($i=$start;$i<=$end;$i++){ $func($i) if($func($i)){ echo "{$i}<br/>"; } } } function fliter($num){ if($num%3!=0){ return true; }else { return false; } } function fliter1($num){ if($num>20&&$num%5==0){ return true; }else { return false; } } func(1,100,"fliter1"); func(10,30,function($num){ return true; });
使用call_user_func_array和call_user_func自定義回調函數
function func(){ $arr = func_get_args(); $str = ""; for($i=0;$i<count($arr);$i++){ $str.= $arr[$i]; } return $str; } //apply echo call_user_func_array("func",array("jierui","edu","h51701","web")); //相當於,執行func函數,並且把數組中的每一項作為參數傳入。 echo "<br/>"; //call echo call_user_func("func","jierui","h51701","edu")
[匿名函數]
1、由於變量函數在調用時存在多種調用方式,(func()/$Fun();)
所以為了讓函數的調用更為同一,才產生了匿名函數
!!!聲明匿名函數,函數體后面的分號必不可少。
!!!匿名函數本身也是變量,用var_dump()檢測為object類型。
$func =function($param){ echo "我是匿名函數{$param}<br/>"; }; $func(10); var_dump($func);
[遞歸函數]
1、所謂遞歸,指的是在函數內部,調用函數自身的操作
2、遞歸分為兩步:遞、歸
遞:從最外層函數依次往里調用自身
歸:最內層函數執行完后,在逐步向外調用外層函數的后半部分
當最外層函數體中,遇到自身函數調用,繼續進入內層函數執行,而最外層函數的后半部分暫不執行,指導最內層函數執行完畢后,在逐步向外執行
function func($num){ echo $num."<br/>"; if($num>0){ func($num-1); } echo $num."<br/>"; } func(10);
使用遞歸求1-10的階乘
function func($num){ static $jie=1; if($num>0){ $jie *=$num; func(--$num); } return $jie; } echo func(10);
[include&rquire]
1、兩者的作用,都是用於引入外部的PHP文件到當前文件中;
2、兩者的區別:當引入的文件錯誤時,include會產生警報,並不影響后續代碼執行,而require會產生致命錯誤,后續代碼全部不再執行。
3、一般,應用於在文件最上方導入某些文件時使用require導入,如果導入失敗,則不執行文件。而,如果在某些分支條件中,導入某些分支結構。一般使用include導入。一旦出錯,分支不執行。
4、include_once和require_once表示:文件只能導入一次,如果多次調用此函數,則后面的語句會判斷文件是否導入,在決定是否導入新文件。
(檢測文件是否導入時,只關心文件是否已經導入,並不關心使用何種方式導入的。)
include('text.txt')
require_once('text.txt');//由於include進來了,require不在導入
5、include和require可以導入各種類型的文件,相當於在當前文件copy一份,但是在copy過程中,PHP引擎會進行適當的編譯,確保不會出錯。
6、include和require勢函數,也是指令,PHP對於很多常用函數,會提供執行的寫法,例如echo("11");//函數寫法 echo "11"//指令寫法
require 'function.php'; include 'function.php'; func1(); func2(); func3();
[PHP閉包]
在PHP中,子函數無法直接訪問父函數的局部變量,必須使用use關鍵字向下傳遞。