本節講解內容
- 數組的介紹
- 數組的創建
- 數組的動態增長
- 數組的遍歷
- 數組的相關函數
- 數組運算符
前言
在前面我們所學的不管是變量和常量,都是一個個單個的數據,而有時候我們有這樣的需求,需要把一些相同類型的數值或一些不相干的數值,合理的存儲起來,而用到的時候可以按照某種規則取出數據。這時候前面的變量等就不能滿足要求,在這裏就是用到數組。
數組的介紹
PHP中的數組和別的語言的數組不一樣,這也是PHP語言語法的鬆散性造成的。那有什麼不一樣?
所謂數組,就是相同數據類型或不同的數據類型元素按一定順序排列的集合,就是把有限個變量用一個名字命名,然後用編號區分他們的變量的集合,這個名字稱爲數組名,編號稱爲下標。組成數組的各個變量稱爲數組的分量,也稱爲數組的元素,有時也稱爲下標變量。
數組的定義通俗的理解就是存放數據的集合,
<?php
//定義一個數組,裏面存放的數據類型可以任意類型
$arr = array(12,true,false,'abcd',12.2);
print_r($arr);//輸出數組。
.....結果......
Array ( [0] => 12 [1] => 1 [2] => [3] => abcd [4] => 12.2 )
可以看到在數組中存放各種數據類型,在輸出的時候都可以進行輸出。並且可以看到在輸出的時候,每個數值都有一個下標於之對應,這個下標就稱之爲鍵(key),而數值是值(value),我們在想取某個值得時候可以通過鍵來取。
$a = 數組名[鍵名]
echo $arr[0];
.....結果......
12
當數組的鍵值是數字的時候,它的下標是從0開始計算的。
那麼數組的怎麼創建的呢?
數組創建的三種方式
- 索引數組(下標是數字的)在PHP中定義數組的方式有三種。
- 關聯數組(下標是字符串)
- 數組的下標兩者都有。
第一種
<?php
//定義數組,數值用逗號隔開。
$arr = array(1,2,3,4,'abcd',true);
print_r($arr);
.....結果......
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => abcd [5] => 1 )
用 array() 語言結構來新建一個數組,從輸出結果中可以看到下標是數字。而取數據也是通過數字下標來取的。這就是索引數組。
第二種
<?php
//關聯數組,自己定義下標,用=>來定義鍵和值
$arr = array('a' => 1,'b' => 2,'c' => 'abcde', 'd' => true);
print_r($arr);
.....結果......
Array ( [a] => 1 [b] => 2 [c] => abcde [d] => 1 )
這種方法也是用array()語法結構來定義的,但是數組的下標是我們自己定義的,這裏可以根據自己的情況自己定義下標。關於鍵值得定義需要注意,key 會有如下的強制轉換
- 包含有合法整型值的字符串會被轉換爲整型。例如鍵名 “8” 實際會被儲存爲 8。但是 “08” 則不會強制轉換,因爲其不是一個合法的十進制數值。
- 浮點數也會被轉換爲整型,意味着其小數部分會被捨去。例如鍵名 8.7 實際會被儲存爲 8。
- 布爾值也會被轉換成整型。即鍵名 true 實際會被儲存爲 1 而鍵名 false 會被儲存爲 0。
- Null 會被轉換爲空字符串,即鍵名 null 實際會被儲存爲 “”。
- 數組和對象不能被用爲鍵名。堅持這麼做會導致警告:Illegal offset type。
如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了。
取關聯數組中的值需要使用自己定義的鍵來取。
第三種
<?php
$arr[0] = 1;
$arr[2] = 2;
$arr['a'] = 12;
$arr[4] = 45;
print_r($arr);
.....結果......
Array ( [0] => 1 [2] => 2 [a] => 12 [4] => 45 )
第三種數組的定義可以直接用方括號進行定義,系統會默認的認爲這是一個數組,並進行創建。至於下標你可以使用數字或者字符串。但是如果在數組定義中多個單元都使用了同一個鍵名,則只使用了最後一個,之前的都被覆蓋了。
數組的動態增長
PHP的數組的長度是一個不固定的,當你填完數據時候,你還是可以進行填寫數據的,同時數組的長度也會跟着增加,這就是php數組的動態增長。
<?php
for($i = 0; $i < 10; $i++){
$arr[] = $i;
}
print_r($arr);
......結果.......
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 )
上面的代碼利用一個for循環,使用數組的第三種定義方式進行賦值,但是可以看到我們並沒有在數組的方括號裏面寫下標,但是程序並沒有報錯,這是因爲數組的動態增長。如果未指定key的值,PHP 將自動使用之前用過的最大 integer 鍵名加上 1 作爲新的鍵名。因此,在輸出結果中可以看到下標是從0開始自動增長的。
數組的遍歷
前面我們介紹了數組的創建和基本的使用,那麼怎麼從數組中全部的取出裏面的值?在PHP中,可以使用循環控制流程取到數組中的值,通過循環遍歷數組來逐個得到裏面的值。
for
在數組的遍歷中可以使用for來的到數組裏面的值。
<?php
$arr = array(1,9,4,2,8,10,5);
$sum = count($arr);
for($i = 0; $i < $sum; $i++){
echo $arr[$i] . ' ';
}
.....結果......
1 9 4 2 8 10 5
上面的count()這個系統函數是統計一個數組裏的所有元素,或者一個對象裏的東西。從而的到數組的大小,也就是長度。然後通過for循環,把$i當做數組的下標($i從0開始)。
foreach
在上面的代碼中如果我們的數組是關聯數組,也就是數組的下標是一個字符串,那麼上面的代碼是不可能取出來。所以我們可以使用PHP提供的另外一種循環方法:foreach()。它的語法有兩種:
foreach(數組名 as $key => $value){
}
foreach(數組名 as $value){
}
其中“as”是一個關鍵字,不能變。
foreach裏面有可以有三個參數,第一個參數是數組的名字,第二個參數
當裏面的參數是兩個的時候,$value只用來存放從數組中取出來的值,而沒有鍵。
<?php
$arr = array(1,9,4,2,8,10,5);
foreach ($arr as $key => $value) {
echo $key . '=>' . $value . ' ';
}
echo '<br>';
foreach ($arr as $value) {
echo $value . ' ';
}
.....結果......
0=>1 1=>9 2=>4 3=>2 4=>8 5=>10 6=>5
1 9 4 2 8 10 5
在第二個循環中沒有鍵的輸出。
上面的兩種循環結構,就是我們常用到的數組遍歷的方法,其中第二個方法,也就是用foreach的方法,我們會經常用到,因爲這種方法對於所有的數組都適用,而不用考慮下標的問題。
數組的相關函數
- count($array) 統計一個數組裏的所有元素,或者一個對象裏的東西。從而的到數組的大小,也就是長度。然後通過for循環,把
i當做數組的下標( i從0開始)。 - is_array($arr) 判斷變量是否是一個數組。傳一個變量進去,如果這個變量是一個數組,則返回true,否則則返回false;
- array_search (value) 在數組中搜索給定的值,如果成功則返回相應的鍵名 。當我們想知道一個數組中有沒有一個數,可以使用這個函數,如果數組中有你想找的值,則返回這個值對應的鍵值。
array_reverse($arr),傳進去一個數組,返回一個與這個數組相反的數組。
<?php $arr = array(1,9,4,2,8,10,5); $array = array_reverse($arr); print_r($array); .....結果...... Array ( [0] => 5 [1] => 10 [2] => 8 [3] => 2 [4] => 4 [5] => 9 [6] => 1 )
array_merge($arr1,$arr2),傳進去兩個數組,一個數組中的值附加在前一個數組的後面。返回作爲結果的數組。 如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
unset($value) 傳進去的變量可以銷燬一個數組,也可以銷燬數組中的一個值,當通過數組[下標]的方式傳入是,會銷燬數組中的這個值,但是當傳進去的數組時,會把整個數組進行銷燬。
sort() 本函數對數組進行排序。當本函數結束時數組單元將被從最低到最高重新安排。當數組中值都是數字的時候,可以使用這個函數進行排序,不過排序的結果是數字按照從小到大的順序。
<?php $arr = array(1,9,4,2,8,10,5); sort($arr); print_r($arr); .....結果..... Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 8 [5] => 9 [6] => 10 )
usort($array,func_name) 傳進去一個數組,和一個自己寫的方法名。使用用戶自定義的比較函數對數組中的值進行排序,在上面的一個方法,你只能得到從小到大的順序,但是我們的要求是從大到小,這就會用到這個函數,第二個參數是我們寫的排序規則的函數。
<?php $arr = array(1,9,4,2,8,10,5); function mysort($a,$b){ //寫自己的函數,使數組按照從大到小的順序進行排序。 if($a == $b){ return 0; } return $a < $b ? 1 : -1; } usort($arr, 'mysort'); print_r($arr); ......結果...... Array ( [0] => 10 [1] => 9 [2] => 8 [3] => 5 [4] => 4 [5] => 2 [6] => 1 )
這裏使用到可變函數。
數組的運算符
我們在運算符那一節並沒有講到數組的運算符,其實數組也是有運算符的。
- $a + $b 聯合 $a 和 $b 的聯合。運算符把右邊的數組元素附加到左邊的數組後面,兩個數組中都有的鍵名,則只用左邊數組中的,右邊的被忽略。
- $a == $b 相等 如果 $a 和 $b 具有相同的鍵/值對則爲 TRUE 。
- $a === $b 全等 如果 $a 和 $b 具有相同的鍵/值對並且順序和類型都相同則爲 TRUE 。
- $a != $b 不等 如果 $a 不等於 $b 則爲 TRUE 。
- $a <> $b 不等 如果 $a 不等於 $b 則爲 TRUE 。
- $a !== $b 不全等 如果 $a 不全等於 $b 則爲 TRUE 。
在這裏看來數組的運算符也是很好理解的。
總結
數組講到這裏,算是基本講完了,數組在我們的開發中是經常用到的,不止上面的以爲數組,有時候數組裏面還可能是一個數組,只要數組的結構在腦海中有清晰的認識,不管有幾個數組,都是可以解決的,同時數組的出現也引出了一些關於數組的算法。可以看
數組的順序查找和二分查找