PHP之數組和函數的基本教程


[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關鍵字向下傳遞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM