(32)數組中常用的多遍歷方式(33)PHP中預定義的超全局數組

(32)數組中常用的多遍歷方式
數組的遍歷,最常用的三種方式:
1. 使用for語句循環遍歷數組
a. 其它語言(只有這一種方式)
b. PHP中這種方式不是我們首選方式(在其他語言是首選的方式)
c. 使用for循環的要求:數組必須是索引數組,而且下標還必須是連續的
但是在PHP中還有(索引數組下標還可以不連序,數組還有關聯數組)這就是這種方式不是首選的原





$user=array(1, "zhasna", 40, "nan", "[email protected]");  //這種數組默認數組是連續的
  
for($i=0; $i<count($user); $i++){


echo "\$user[{$i}]=".$user[$i]."<br>";  //輸出下標爲幾的值
}
例如:
$user=array(1, "zhasna", 10=>40, "nan", "[email protected]");//假如下標不連續出現10=>40,那


麼結果只顯示下標爲0、1的其餘的都不顯示值
  
for($i=0; $i<13; $i++){    //假如給下標規定範圍如$i<13,那麼只顯示下標爲0、1和


10、11、12.其他的都爲空
echo "\$user[{$i}]=".$user[$i]."<br>";
}


再例如;
$user=array(1, "name"=>"zhasna", "age"=>40, 100=>"nan", "[email protected]");
  
for($i=0; $i<13; $i++){     //也不顯示其他的,只顯示下表爲0的
echo "\$user[{$i}]=".$user[$i]."<br>";
}


2. 使用foreach語句循環遍歷數組,這是PHP最常用的方式
foreach(數組變量 as 變量值){
  //循環體
    }
  a. 循環次數由數組的元素個數決定,有幾個元素就循環幾次
 b. 每一次循環都會將數組中的元素分別賦值給後面變量
 
 
 
    }
例如;
$user=array(1, "name"=>"zhasna", "age"=>40, 100=>"nan", "[email protected]");
  
  foreach($user as $val){   //$var 是自定義變量, 只要符合命名規範就可以
  echo $val."<br>";//依次輸出值,與下標無關
  }


foreach(數組變量 as 下標變量=> 值變量){
再例如 :
$user=array(1, "name"=>"zhasna", "age"=>40, 100=>"nan", "[email protected]");
  
  foreach($user as $key=>$val){   //$var 是自定義變量, $key自定義變量
  echo $key."=========>".$val."<br>";//-------前面是下標,後面是元素。
  }


二維數組或三維數組:
$info=array(
"user"=>array(
  //$user[0]
   array(1, "zansan", 10, "nan"),
  //$user[1][1]
   array(2, "lisi", 20, "nv"),    //$user[1]
  //$user[2]
   array(3, "wangwu", 30, "nan")
),
       "score"=>array(
   array(1, 100, 90, 80),
   array(2, 99, 88, 11),
   array(3, 10, 50, 88)
),
"connect"=>array(
array(1, '110', '[email protected]'),
array(2, '120', '[email protected]'),
array(3, '119', '[email protected]')
)
);


foreach($info as $tableName=>$table){
echo '<table align="center" width="500" border="1">';
echo '<caption><h1>'.$tableName.'</h1></caption>';
foreach($table as $row){  //輸出每行,row是行,這是第二維數組
echo '<tr>';
foreach($row as $col){   //輸出每行裏的每列,col是列,這是這是嵌套在第


二位數組裏的第三維數組。
echo '<td>'.$col.'</td>';
}
echo '</tr>';
}
echo '</table>';
}
3. while() list() each() 組合循環遍歷數組,比較麻煩,不是首選


(1)首先看each()函數, 
    a. 需要一個數組作爲參數
  b. 返回來的也是一個數組
  c. 返回來的數組是0, 1, key, value四個下標(固定的)
  0和key下標是當前參數數組元素的鍵
  1和value下標是當前對數數組元素的值
 
        d. 默認認當前元素就是第一個元素
        e. 每執行一次後就會將當前元素向後移動
        f. 如果到最後的元素再執行這個函數,則返回false
例如:
$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
  $a=echo($user);
  print_r($a);//結果是Array ( [1] => 1 [value] => 1 [0] => id [key] => id ) 1和value


對應的都是這個值1,而0和key對應的都是下標id


   $b=echo($user);
  print_r($b);//結果是Array ( [1] => zhangsan [value] => zhangsan [0] => name [key] 


=> name )


$c=echo($user);
  print_r($c);//結果是Array ( [1] => 10 [value] => 10 [0] => age [key] => age)


$d=echo($user);
  print_r($d);//結果是Array ( [1] => nan [value] => nan [0] => sex [key] => sex )


$e=echo($user);
  print_r($e);//結果是bool(false),當走到頭的時候就會輸出假


然而,我們可以用while
$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");

while($arr=each($user)){
//echo $arr[0]."==>".$arr[1]."<br>";
echo $arr["key"]."---->".$arr["value"]."<br>";//可以用這兩種形式
}


(2)list()函數
 PHP中只有這一種形式將數值賦給函數,其他的都是付給變量。
a. list()=array(); 需要將一個數組賦值給這個函數,只是區別於其他語言的。
b. 數組中的元素個數,要和list()函數中的參數個數相同
c. 數組中的每個元素值會賦值list()函數中的每個參數,list()將每個參數轉爲變量
d. list()只能接收索引數組
e. 按索引的下標的順序
例如:
list($name, $age, $sex)=array("zansan", 10, "nnnnn");
echo $name."<br>";
echo $age."<br>";
echo $sex."<br>";
它還有一種形式,
如果只想輸出性別
list(, , $sex)=array("zansan", 10, "nnnnn");


echo $sex."<br>";
如果只想輸出姓名和性別
list($name,, $sex)=array("zansan", 10, "nnnnn");
echo $name."<br>";


echo $sex."<br>";//不需要的變量就不需要聲明


它的用途很廣泛
以後將數組轉變成變量的時候
例如:
$ip="192.168.1.128";
$ips=explode(".", $ip);//這是一個分割函數,通過什麼分割?通過“.”分割。分割什麼?分割


$ip


我們可以
$ip="192.168.1.128";
list($a,$b ,$c , $d)=explode(".", $ip);


echo $a;
echo $b;
echo $c;
echo $d;




我們只需要d的時候


$ip="192.168.1.128";
list(,,, $d)=explode(".", $ip);
echo $d;//在以後的程序中d就可以當128用


$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");


list($a, $b,$c,$d)=each($user);  //( [1] => 1 [value] => 1 [0] => id [key] 


=> id )這樣是不可以的因爲list()只能接受索引數組。而後面的1與value,0與key都是相關數組


。所以它只能接受兩個。例如:
$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");


list($key, $value)=each($user);  //Array ( [1] => 1  [0] => id  ) 


echo $key."-->".$value;//不管數組中它的下標是多少,最後只按索引時它的下標順序


輸出。


我們還可以:
$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
   while(list($key,$value)=each($user)){
         echo  $key_"==>"_$value_"<br>";
}
將id、name、age、sex依次賦給$key
將1、zhangsan、10、nan依次賦給$value


然而,
$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");
   while(list($key,$value)=each($user)){
         echo  $key_"==>"_$value_"<br>";
}


while(list($key,$value)=each($user)){
         echo  $key_"==>"_$value_"<br>";
}


while(list($key,$value)=each($user)){
         echo  $key_"==>"_$value_"<br>";
}


只能執行一次,因爲最後一次返回是假,下面的都執行不了。


我們卻可以使用數組的內部指針控制函數,來改變這樣的結果
next(數組);數組的指針向下一個移動
prev(數組);數組的指針向上一個移動
reset(數組);把指針移到數組第一個
end(數組);把數組指針移動到最後


current(數組);//獲取當前元素的值
key(數組);//獲取當前元素的鍵值,這兩個函數都不移動指針
 

$user=array("id"=>1, "name"=>"zhangsan", "age"=>10, "sex"=>"nan");


while(list($key, $value)=each($user)){
echo $key."==>".$value."<br>";
}
reset($user);  //指針移到第一個
while(list($key, $value)=each($user)){
echo $key."==>".$value."<br>";
}
reset($user);//指針移到第一個
next($user);//指針移到下一個
next($user);//指針移到下一個
while(list($key, $value)=each($user)){
echo $key."==>".$value."<br>";
}
reset($user);


echo current($user)."===========>".key($user)."<br>";
end($user);
echo current($user)."===========>".key($user)."<br>";
prev($user);

echo current($user)."===========>".key($user)."<br>";



(33)PHP中預定義的超全局數組
預定義數組:
 自動全局變量---超全局數組
 
 1. 包含了來自WEB服務器,客戶端,運行環境和用戶輸入的數據
 2. 這些數組比較特別
 3. 他們的優點是:全局範圍內自動生效,隨便打開一個腳本都可以直接使用這些數組
 4. 用戶不能自定義這些數組,然而我們在以後的定義當中應該避免命名與這些預定義函數相同。但這些數據操作方式又和我們自定義的數組操作方式一樣
5. 在函數中直接可以使用這些數組


以下是自動全局變量也稱超全局數組
一、$_GET     //經由URL請求提交至腳本的變量 ,有兩種情況不能用GET,第一、特別是表單的形式不能用GET,因爲密碼會出現在URL上,不安全。第二、大數據不要用GET,因爲URL位置有限,它最多隻能裝8092個字節。
二、$_POST     //經由HTTP POST 方法提交到腳本的變量,在添加文章時,或者有文件上傳時,必須用POST,因爲量大。最大不可以超過物理存儲器的內存
三、 $_REQUESt   //經由GET, POST和COOKIE機制提交 到腳本的變量,因此該數組並不值得信任,不去使用(儘量)
四、 $_FILES    //經由HTTP POST  文件上傳而提交至腳本, 下面文件處理一章,專門講文件上傳
五、$_COOKIE    //這兩個是用於會話控制,跟蹤用戶變量
六、$_SESSION   //
七、$_ENV        //執行環境提交至腳本的變量
八、$_SERVER     //變量由WEB服務器設定的,或 直接和當前腳本的執行環境相關聯
九、$GLOBALS    //只要是當前腳本有效的變量都在這裏,數組鍵名爲全局變量的名稱
 
$_ENV["hello"]="#################3";//直接取值就可以用
print_r($_ENV);  //可以直接輸出,因爲它本身是存在的。


那麼超全局數組與全局數組有什麼區別呢?


$arr=array(10, 20);
 
function demo(){

print_r($arr);//它不會顯示結果,因爲全局變量需要用global $arr來進行函數聲明

 }
demo();


然而
$arr=array(10, 20);
 $_GET=array(50, 90);
function demo(){
global $arr;
print_r($arr);
print_r($_GET);//超全局變量不需要函數內部聲明,在任何函數任何地方都可以直接用。
 }
demo();


例如:
<?php
        echo $username_"<br>";   //可以直接輸出下面的元素
echo $email_"<br>";   
echo $page_"<br>";  //任何保存到POST和GET裏面的元素都可以當變量用,但是它們是存放在PHP配置文件裏的,如果將PHP.ini裏的register globals=off,關閉,那麼我們這種方式的輸出就不會顯示。管理員的操作會影響程序,我們爲了安全起見是關閉這個函數的。那麼怎樣可以不受它關閉的影響呢?我們看下面的函數


echo $_GET["username"]."<br>";   //因爲GET是通過URL請求的形式提交腳本變量,所以,這些元素都在GET裏,我們可以通過GET來提取
echo $_GET["email"]."<br>";   
echo $_GET["page"]."<br>";  
$_GET["eeee"]="@@@@@@@@@@@@";  //我麼可以重新往裏面賦值
print_r($_GET);  //用戶如果用GET提交的,我們就用這個函數接收
print_r($_POST);   //用戶如果用POST我們就用這個接收
print_r($_REQUEST);  //如果前面用GET,那麼POST裏面不會有值,但是REQUEST裏面會有GET的值。
?>


<form action="demo.php" method="post">   //製作表單,表單可以指定方法,默認爲不指定就是GET方法。POST是隨HTTP提交,它會把表單一起提交給服務器。
username : <input type="text" name="uname"><br>
password:  <input type="password" name="pass"><br>
<input type="submit" value="login"> <br>
</form>




<a href="demo.php?username=zhangsan&[email protected]&page=45">this is a $_GET test</a>   //我們可以建立一個超鏈接。第一和第二個參數間用“?”連接,以後的都用&連接。


七、
?>


<?php
echo '<pre>';
print_r($_ENV);
echo '</pre>';  //會出現所有的環境


echo $_ENV["OS"]."<br>";  //查看是什麼系統


foreach($_ENV as $key=>$value){     //遍歷
echo $key."=".$value."<br>";
}




八、?>


<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';   //所有的與當前執行環境有關的ID等等詳細信息。


echo $_SERVER["DOCUMENT_ROOT"]."<br>";


foreach($_SERVER as $key=>$value){
echo $key."=".$value."<br>";





九、?>


<?php
$a=100;
$b=200;
$c=300;  //因爲是函數內聲明,所以這三個變量也會出現在內部
echo '<pre>';
print_r($GLOBALS);
echo '</pre>';   //所有有效的變量都在這裏包括GET、POST、等等




function demo(){
echo $GLOBALS["a"]."<br>";
echo $GLOBALS["b"]."<br>";
echo $GLOBALS["c"]."<br>";

}


demo();
demo();
demo();
demo();
demo();
demo();
demo();




































































































































































































































































































































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章