PHP基礎入門(四)---PHP數組實用基礎知識

来源:http://www.cnblogs.com/hope666/archive/2017/06/25/7073094.html
-Advertisement-
Play Games

【數組基礎】【數組遍歷】【超全局數組】【數組功能】【數組函數】 ...


PHP數組

       數組是特殊的變數,它可以同時保存一個以上的值。

   ***關鍵詞:數組基礎、數組遍歷、超全局數組、數組功能、數組函數。

 

 

 

 

下麵來和大家分享一下有關PHP的數組基礎知識,希望對你PHP的學習有所幫助~

 

一、PHP數組基礎部分

 

PHP數組的分類


按照下標的不同,PHP數組分為關聯數組和索引數組;
索引數組:下標從0開始,依次增長
關聯數組:下標為字元串格式,每個下標字元串與數組的值一一關聯對應(類似對象的鍵值對)

 

代碼演示:

1 $arr1 = array(1,2,3,4,5,6,7);//索引數組
2 var_dump($arr1);
3    
4 $arr2 = array("one"=>1,"two"=>2,"three"=>3);//關聯數組
5 var_dump($arr2);
6    
7 $arr3 = array(1,"one"=>2,3,5=>4,5,6,"10.0"=>7,"08"=>8,"08"=>10,"hahah"=>9);
8 var_dump($arr3);

 

關於關聯數組和索引數組


1、數組中,可以同時存在索引數組與關聯數組。
array(1,2,3,"one"=>4);

 

2、數組中,所有的索引數組,如果不加指定,會去掉關聯項,預設增長(即,關聯數組不占索引位);
array(1,2,"one"=>3,4,5);//1,2,4,5的索引--->0/1/2/3

 

3、如果,關聯數組的key,是純十進位整數字元串,
則會將此數字轉為索引數組的索引值;("10.0"/"08"等格式,仍然是關聯數組,不轉為索引)
array(1,2,"one"=>3,"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

 

數組的聲明方式


1、直接賦值聲明
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
$arr[] = 1;
var_dump($arr);

2、[]字面量聲明(PHP5.4版本之後能用)
$arr = [1,2,3,4,"one"=>5,6];
var_dump($arr);

3、Array()聲明 沒有new關鍵字
$arr = array(1,2,3,4,5);
var_dump($arr);

 

數組元素的讀取


PHP中,數組支持[]和{}讀取下標。


多維數組

①數組的一個值,依然是一個數組,我們稱這種數組為多維數組;
②多維數組,不要求所有的項都是數組,可以是數組與普通值的混合;
③多維數組,也不要求每個子數組的個數限制,可以是任意的長度。

使用多維數組,一定要註意,數組中分隔用逗號!
原則上,多維數組一般不超過3層使用!

 

三維數組代碼演示如下:

 1 $H51701 = array(
 2 "group1"=>array(
 3 array("name"=>"張三","age"=>14,"sex"=>"男"),
 4 array("name"=>"李四","age"=>15,"sex"=>"男"),
 5 array("name"=>"王二","age"=>13,"sex"=>"男")
 6 ),
 7 "group2"=>array(
 8 array("name"=>"張三","age"=>15,"sex"=>"男"),
 9 array("name"=>"李四","age"=>15,"sex"=>"男"),
10 array("name"=>"王二","age"=>14,"sex"=>"男")
11 ),
12 "group3"=>array(
13 array("name"=>"張三","age"=>14,"sex"=>"男"),
14 array("name"=>"李四","age"=>18,"sex"=>"男"),
15 array("name"=>"王二","age"=>24,"sex"=>"男")
16 ),
17 );
18 var_dump($H51701);

 

 

二、數組遍歷

 

1、使用for迴圈遍曆數組
count($arr);用於統計數組元素的個數

for迴圈只能用於遍歷,純索引數組!
如果存在關聯數組,count統計時會統計兩種數組的總個數,使用for迴圈遍歷混合數組,導致數組越界!

代碼如下:

1 $arr = array(1,2,3,"one"=>4,5,6,7);
2 $num = count($arr);
3 echo"數組元素的個數{$num}<br/>";
4 for($i=0;$i<$num;$i++){
5 echo "{$i}==>{$arr[$i]}<br/>";
6 }

 

2、forEach迴圈遍曆數組
foreach可以遍歷任何類型的數組!

代碼如下:

1 $arr = array(1,2,3,"one"=>4,5,6,7);
2 foreach($arr as $key=>$item){
3 echo "{$key}==>{$item}<br/>";
4 }

 

下麵我們來做一個數組遍歷的小練習~看代碼~

 1 $arr = array(
 2 "group1"=>array(
 3 array("name"=>"張三","age"=>14,"sex"=>"男"),
 4 array("name"=>"李四","age"=>12,"sex"=>"男"),
 5 array("name"=>"王二","age"=>18,"sex"=>"男")
 6 ),
 7 "group2"=>array(
 8 array("name"=>"張三","age"=>14,"sex"=>"男"),
 9 array("name"=>"李四","age"=>16,"sex"=>"男"),
10 array("name"=>"王二","age"=>19,"sex"=>"男")
11 ),
12 "group3"=>array(
13 array("name"=>"張三","age"=>14,"sex"=>"男"),
14 array("name"=>"李四","age"=>12,"sex"=>"男"),
15 array("name"=>"王二","age"=>13,"sex"=>"男")
16 ),
17 );
18 
19 foreach($arr as $key=>$value){
20 echo "{$key}<br/>"; 
21 foreach($value as $key1=>$value1){
22 echo "第".($key1+1)."個同學<br/>";
23 foreach($value1 as $key2=>$value2){
24 echo "{$key2}==>{$value2}<br/>";
25 }
26 echo"<br/>";
27 }
28 echo"----------------------<br/>";
29 }

 

3、使用list(),each(),while()遍曆數組
list():用於將數組的每一個值,賦值給list函數的每一個參數。(list函數的參數,必須<=數組的元素個數);
eg:list($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。

4、使用list()/each()/while()配合遍曆數組※※※

1 while(list($key,$value) = each($arr)){
2 echo "{$key}-->{$value}<br>";
3 }
4 reset($arr);

!!!數組使用each()遍歷完一遍後,指針使用處於最後一位的下一位,即再用each(),始終返回false;
如果還需使用,需用reset($arr);函數,重置數組指針。

$arr = [1,2,3,4];
list($a,$b,$c,$d) = $arr;
echo "a-->{$a}<br/>";
echo "b-->{$b}<br/>";
echo "c-->{$c}<br/>";
echo "d-->{$d}<br/>";

while($a = each($arr))

①each($arr)返回數組或false;
②把數組或false賦值給$a;
③while判斷$a如果是數組,繼續執行下一位;
如果$a是false,終止迴圈。

 1 while($a = each($arr)){
 2 echo "{$a[0]}-->{$a[1]}<br>";
 3 echo "{$a['key']}-->{$a['value']}<br>";
 4 }
 5 
 6 while(true){
 7 $a = each($arr);
 8 if($a){
 9 echo "{$a[0]}-->{$a[1]}<br>";
10 echo "{$a['key']}-->{$a['value']}<br>";
11 }else{
12 break;
13 }
14 }
15 
16 while(list($key,$value) = each($arr)){
17 echo "{$key}-->{$value}<br>";
18 } 
19 reset($arr);

 

5、使用數組指針遍曆數組

①next:將數組指針,後移一位,並返回後一位的值,沒有返回false
②prev:將數組指針,前移一位,並返回前一位的值,沒有返回false
③end:將數組指針,移至最後一位,返回最後一位的值,空數組返回false
④reset:將數組指針,恢復到第一位,並返回第一位的值,空數組返回false
⑤key:返回當前指針所在位的鍵;
⑥current:返回當前指針所在位的鍵;

 1 $arr = [1,2,3,4,"one"=>5];
 2 while(true){
 3 echo key($arr);
 4 echo "--";
 5 echo current($arr);
 6 echo "<br>";
 7 if(!next($arr)){
 8 break;
 9 }
10 }
11 reset($arr);
12 do{
13 echo key($arr);
14 echo "--";
15 echo current($arr);
16 echo "<br>";
17 }while(next($arr));
18 reset($arr);

 

三、超全局數組


超全局數組,超全局變數,預定義數組,預定義變數——說的都是它。

PHP給我們提供了一組包含強大功能的超全局數組,可以在任何地方,任何作用域不需聲明,直接使用!不受任何作用域限制。

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
var_dump($_SERVER);
echo ($_SERVER{'HTTP_USER_AGENT'});

2、環境變數:$_ENV
將系統環境變數,轉變為PHP中的數組,就是$_ENV;

PHP預設是關閉此全局數組的。如果需要使用,
需修改php.ini文件中的variables_order = "GPSC",
改為variables_order = "EGPSC";

但是,修改後會有系統性能損失,港方並不推薦使用。
可以使用getenv()函數取代全局變數,取出每個系統環境變數的值。

phpinof();函數,包含了有關PHP的各種信息,其實environment板塊就是系統環境的變數,可以使用getevn()函數取出其中的值;

3、HTTP GET變數:$_GET
獲取前臺通過get方式提交的數據

1 if(isset($_GET["sybmit"]&&isset($_GET["pwd"]))){
2 if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){
3 echo "Get登錄成功!";
4 }else{
5 echo "Get登錄失敗!";
6 }
7 }

 

4、HHTP POST變數:$_POST
獲取前臺通過post方式提交的數據

1 if(isset($_POST["sybmit"])){
2 if($_POST["username"]=="111"&&$_POST["pwd"]=="111"){
3 echo "POST登錄成功!";
4 }else{
5 echo "POST登錄失敗!";
6 }
7 }

 

5、request變數:$_REQUEST
包含了$_GET,$_POST和$_COOKIE的數組
由於request同時包含get和post,可能導致get與post的鍵衝突,並且頻率也不高。所以,並不使用request。
var_dump($_REQUEST);

6、HTTP文件上傳變數:$_FILES
通過HTTP POST方式上傳到當前腳本的項目的數組。
var_dump($_FILES);

7、HTTP Cookies:$_COOKIE
取到頁面中的Cookie信息
1 setcookie("cookie","haha");

2 $_COOKIE["hehe"] = "hehe";

3 var_dump($_COOKIE); 


8、Session變數:$_SESSION
取到保存在Session中的信息。
session_start();
$_SESSION["haha"] = "haha";
var_dump($_SESSION);*/

9、Global變數:$GLOBALS
$GLOBALS包含了上述8個全局數組,可以通過$GLOBALS["_SERVER"]取到$_SERVER
還可以通過給$GLOBALS數組追加下標。創建全局變數,可以在函數里函數外隨意訪問:$GLOBALS["name"] = "zhangsan";
var_dump($GLOBALS["_SERVER"]);

 

四、數組功能

 

1、返回數組所有的值,返回數組
var_dump(array_values($arr));

2、返回數組所有的鍵,返回數組
var_dump(array_keys($arr));

3、檢測數組中是否包含某個值。返回真、假
參數:需要查詢的值,數組,true(===)/false(===) 預設
var_dump(in_array("8",$arr,true));

4、交換數組中的鍵和值,返回新數組
var_dump(array_flip("8",$arr));

5、反轉數組,返回新數組
參數:需要反轉的數組
true:保留原有索引數組的下標與值的匹配。
false:只反轉值,鍵不反轉,預設
無論true/false,都不會影響關聯數組,關聯數組鍵,值永遠是一對。
var_dump(array_reverse($arr,true));

6、統計數組元素個數
count($arr);

7、統計數組中,所有值出現的次數,返回一個新數組
新數組格式:鍵-->原數組的值(去重後的值)
值-->原數組對應的值出現的次數。
var_dump(array_count_values($arr));

8、移出數組中重覆的值!
var_dump(array_unique($arr));

9、過濾數組中的每一個值:
①不傳回調函數:過濾掉所有空值(0/""/null/false/"0"/[])
②傳回調函數:需要給回調函數傳遞一個參數,判斷參數是否符合要求,如果符合,return true;否則,return false。

1 var_dump(array_filter($arr,function($num){
2 if($num>4){
3 return true;
4 }else{
5 return false;
6 }
7 }));


通過回調函數,對數組的每一個值,進行處理操作。(直接修改原數組,並返回bool類型的是否成功)
執行時,會給回調函數傳遞兩個參數,分別是數組的value,key,然後可以在毀掉函數中,對值和鍵進行處理。
但是,牽扯到修改值的時候,必須要傳遞地址&!!!!
$fruits = array("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");

1 var_dump(array_walk($fruits,function(&$item,$key){
2 echo "{$key}-->{$item}<br>";
3 $item .= $key;
4 }));
5 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,5];

1 var_dump(array_walk($fruits,function(&$item,$key){
2 echo "{$key}-->{$item}<br>";
3 $item .= $key;
4 }));
5 var_dump($fruits);

 

五、數組函數

sort -- 對數組排序(升序)

var_dump(sort($arr));


rsort--對數組逆向排序(降序)


usort--使用用戶自定義的比較函數對數組中的值進行排序


asort--對數組進行排序並保持索引關係(關聯數組排序)


arsort--對數組進行逆向排序並保持索引關係


uasort--用戶自定義的比較函數對數組進行排序並保持索引關聯


ksort--對數組按照鍵名排序


krsort--對數組按照鍵名逆向排序


uksort--使用用戶自定義的比較函數對數組中的鍵名進行排序


natsort--用“自然排序”演算法對數組排序


natcasesort--用“自然排序”演算法對數組不區分大小寫字母排序


array_multisort -- 對多個數組或多維數組進行排序
第一個參數:第一個數組,必選
第二個參數:SORT_DESC;SORT_ASC(升序降序);
第三個參數:SORT_STRING/SORT_NUMERIC(按照字元串還是數字排序)
再之後是多個數組
排序規則:先排第一個數組,後面的數組會根據和第一個數組的對應關係,一列一列的排序;

如果多個數組多個數組排序,排序的數組長度要相等,否則報警告;

array_slice($array, $offset)
第一個參數:數組,必須;
第二個參數:從第幾位開始截,負數表示從右往左數(按照數組的順序ps:包括關聯數組,而非下標)
第三個參數:截取的長度,可選,預設截取到最後
第四個參數:bool類型的參數,預設為false,索引重新排序,true保持索引關聯
$arr1 = array_slice($arr, 2,5,TRUE);


array_splice($offset)
返回值:數組(被刪掉的部分)
參數:
1、數組的地址,會修改原數組
2、從第幾位開始刪
3、刪除的長度,不填預設到結尾
4、不填,預設為刪除,填,用填的部分替換刪掉的部分;
$arr1 = array_splice($arr, 2,5,[1,2,3,4]);


array_combine($keys, $values);創建一個數組,用一個數組的值作為鍵名,另一個數組的值作為值;
array_combine($keys'作為鍵的數組', $values'作為值的數組');
兩個數組的長度必須一致,否則報警告


array_merge($array1);合併一個或多個數組
合併多個數組,將後面的數組拼接在前面數組的後面
如果多個數組中存在多個同名的關聯鍵,則後面的會覆蓋前面的


array_intersect($array1, $array2);兩個數組取交集
多個數組取交集,結果會保留第一個數組的鍵值關聯匹配


array_diff($array1, $array2);多個數組取差集;
取出多個數組中,在第一個數組中包含,但是在其他數組中不包含的值,保留第一個數組的鍵值關聯;


array_pop();

刪除數組最後一個值;返回刪除的值;


array_push($var);
數組的最後插入一個或多個值;返回處理之後元素的個數


array_shift();
刪除數組第一個值;返回刪除的值;


array_unshift($var);
數組的開頭插入一個或多個值;返回處理之後元素的個數


array_rand($input);隨機抽取數組中的一個到多個鍵名!第二個參數為空,表示抽一個,傳入數字n表示抽n個


shuffle();將函數打亂重新排序

 

好啦~~~今天的內容先分享到這裡,小女子小菜鳥一隻,還請各位園友多多指教·喜歡就點個贊吧~感謝支持!

 

 

 


 

 

 

作者:夕照希望
出處:http://www.cnblogs.com/hope666/  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 空(None) None可以用來表示某一個變數的值缺失,類似於其他語言中的null。 像其他的空值:0,[]和空的string,布爾變數給的是False而不是True。 結果是: 當一個函數沒有返回任何值時,就會返回None: 結果是: Hi None 字典(Dictionaries) 字典是一種給 ...
  • 在上一節中講解了歸併排序的遞歸版《4.比較排序之歸併排序(遞歸)》,通常來講,遞歸版的歸併排序要更為常用,本節簡單介紹下非遞歸版的歸併排序。思路和遞歸版相同,均為先分解後合併,非遞歸的重點在於如何確定併合理的分解待排序數組。 對於遞歸我們是這麼做的: 對於非遞歸來講,切分的不向遞歸從大到小,非遞歸實 ...
  • 在編寫穩定可靠的軟體服務時經常用到輸出堆棧信息,以便用戶/開發者獲取準確的運行信息。常用在日誌輸出,錯誤報告,異常檢測。本文介紹Linux與Windows下用C++獲取堆棧信息的方法。 ...
  • JSON-lib包(最關鍵的兩個類分別是JSONObject和JSONArray)完成對json的構造和一些基本方法的使用。 二者區別: ①JSONObject構造的字元串是鍵值對形式(key:value),多個鍵值對間以英文逗號連接; ②JSONArray構造的字元串是數組形式([array1,a ...
  • 反射的基本概述 一個class文件被載入到記憶體的時候,JVM就會經行解剖,把這個class文件的所有成員全部解剖出來,然後JVM會創建一個Class對象,把這些成員信息全部都封裝起來,所謂反射就是指:我們獲取到這個Class對象,就相當於獲取到了該類的所有成員信息,我們就能操又該類的所有成員. Ja ...
  • 無意間碰到的一個大神整理的Python學習思維導圖,感覺對初學者理清學習思路大有裨益,非常感謝他的分享。 詳情見:https://woaielf.github.io/2017/06/13/python3-all/ 14 張思維導圖 基礎知識 數據類型 序列 字元串 列表 & 元組 字典 & 集合 條 ...
  • /* 工作單元 這個模式涉及到了領域模型、數據映射器和標識映射,這裡就統一進行整理和回顧了。 $venue = new \woo\domain\Venue(null,"The Green Tree"); \woo\domain\ObjectWatcher::instance()->performOp... ...
  • 分享 知識要點:lubridate包拆解時間 | POSIXlt利用決策樹分類,利用隨機森林預測利用對數進行fit,和exp函數還原 訓練集來自Kaggle華盛頓自行車共用計劃中的自行車租賃數據,分析共用自行車與天氣、時間等關係。數據集共11個變數,10000多行數據。https://www.kag ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...