文章目錄
使用數組
數組的本質是用來存儲、管理和操作一組變量。PHP中的數組實際上是一個有序映射,映射是一種把values關聯到keys的類型。
數組類型
PHP中有兩種類型的數組,即索引數組和關聯數組。索引數組的鍵由數字組成,在沒有特別指定時,數組默認爲索引數組。關聯數組的鍵由字符串和數字混合組成。
-
關聯數組:
$array = array('a'=>'foo', 'b'=>'bar')
-
索引數組:
$array = array(1=>'foo', 2=>'bar')
在數組中,如果未指定鍵,PHP就將自動使用之前用過的最大的數字鍵加1作爲新的鍵。
【示例】
<?php
$array1 = array("foo", "bar", "hallo", "world");
var_dump($array1)
echo "<br />";
$array2 = array(
"a",
"b",
6=>"c",
"d",
);
var_dump($array2);
?>
以上代碼輸出結果爲:
代碼解析:
以上代碼中$array1
沒有指定鍵名,所以默認數組爲索引數組,$array2
中最後一個值"d"被自動賦予鍵名7,因爲之前最大整數鍵名是6。
創建數組
可以使用array()創建數組,除此之外還可以使用方括號[]創建數組,還可以使用range()
函數來建立一個包含指定範圍單元的數組。
array range(mixed $start, mixed $limit[, number $step=1])
其中start
是序列的第一個值,序列結束語limit
的值。如果給出了step
的值,它將被作爲單元之間的步進值。step
應該爲正值,如果未指定,step
默認爲1。
二維數組和多維數組
二維數組
將兩個以爲數組組合起來就可以構成一個二維數組,使用二維數組可以保存較爲複雜的數據。
【示例】
<?php
$person = array(
'lily'=>array('age'=>20, 'weight'=>'50kg', 'hobby'=>'sleep'),
'Tom'=>array('age'=>12, 'weight'=>'40kg', 'hobby'=>'eat'),
'Andy'=>array('age'=>30, 'weight'=>'70kg', 'hobby'=>'write')
);
print_r($person);
?>
輸出結果:
代碼解析:
數組person
中的元素lily
、Tom
和Andy
對應的值分別是一個以爲數組,這3個以爲數組組成了一個二維數組。
多維數組
同二維數組一樣,可以很容易的創建三維數組、四維數組或者其他更高維數的數組。實際上可以將所有數組都認爲是以爲數組,只不過其元素依然可以是數組,如果元素也是以爲數組就組成了二維數組,如果元素是二維數組就組成了三維數組,以此類推。
PHP中對多維數組沒有上限的固定限制,但是隨着維度的增加數組會越來越複雜,對於閱讀調試和維護都會變得困難。
數組操作
檢查數組中是否存在某個值
in_array
函數判斷數組中是否存在某個值。
說明:
in_array(mixed $needle, array $haystack[, bool $strict=FALSE]):bool
在haystack
中搜索needle
,如果沒有設置strict
,就是用寬鬆的比較。如果strict
的值爲true,則in_array()函數還會檢查needle
的類型是是否和`haystack中的相同。
參數:
- needle
待搜索的值。如果needle是字符串,則比較是區分大小寫的。 - haystack
待搜索的數組。 - strict
如果第三個參數strict
的值爲TRUE
則in_array()
函數還會檢查needle的類型是否和haystack
中相同
返回值:
如果找到needle則返回TRUE,否則返回FALSE。
【示例】
<?php
$arr = array(
'安徽'=>array(
'阜陽'=>array('阜南縣','臨泉縣','潁州區'),
'宿州'=>array('墉橋區','靈璧縣','泗縣'),
'合肥'=>array('蜀山區','長豐縣','肥東'),
),
'河南'=>array(
'洛陽'=>array('西工區','老城區','孟津縣'),
'鄭州市'=>array('中原區','金水區'),
),
);
var_dump(in_array('阜南縣', $arr)); //false
$arr1 = ['red', 'green', 'black'];
var_dump(in_array('green', $arr1)); //true
?>
代碼解析:
由於沒有設置strict
的值,因此in_array()
只做了一級檢查,只在當前維度檢查是否包含相應元素,而不會遞歸到數組中的每個元素。
數組轉換爲字符串
使用implode()
函數可以將一個一維數組轉化爲字符串。
說明:
implode(string $glue, array $pieces):string
implode(array $pieces):string
該函數用$glue
將一維數組$pieces
的值連接爲一個字符串。
參數:
- glue
默認爲空的字符串。 - pieces
帶轉換爲字符串的數組。
返回值:
返回一個字符串,其內容爲glue分割開的數組的值。
此函數可以安全用於二進制對象。
【示例】
<?php
$arr = array('lastname', 'emial', 'phone'); // 聲明數組
$comma_separated = implode(",", $arr); // 分割數組
echo $comma_separated; // 輸出結果
?>
程序輸出結果:
代碼解析:
以上代碼中,使用“,”將數組的三個元素連接成了一個字符串。
計算數組中的單元數目
使用count()
函數可計算數組中的單元數目,count()
函數還可以計算對象中的屬性個數。
說明:
count(mixed $array_or_countable[, int $mode=COUNT_NORMAL]):int
計算數組中的單元數目,或對象中的屬性個數。
參數:
- array_or_countable
數組或者Countable
對象。 - mode
如果可選的mode
參數設置爲COUNT_RECURSIVE
(或1),count()
將遞歸對數組計數。對計算對維數組的所有單元尤其有用。
返回值:
返回array_or_countable
中的單元數目。如果參數既不是數組,也不是實現Countalbe
接口的對象,將返回1。例外情況:如果array_or_countable
是NULL
則結果是0。
【示例】
<?php
$food = array(
'fruits'=>array('orange', 'banana', 'apple'),
'veggie'=>array('carrot', 'collard', 'pea')
);
echo count($food, COUNT_RECURSIVE); // 結果爲8
echo "<br \>";
echo count($food); // 結果爲2
?>
程序輸出結果:
代碼解析:
以上代碼中$food
爲一個二維數組,當不指定mode
時,默認不會對數組進行遞歸計算,當指定該參數值爲1或者COUNT_RECURSIVE
時,則會對數組進行遞歸,因此結果是8。
數組當前單元和數組指針
使用current()
函數可返回數組的當前單元。
說明:
current(array &$array):mixed
每個數組中都有一個內部的指針指向它“當前的”單元,初始指向插入到數組中的第一個單元。
參數:
- array
這個數組
返回值:
current()
函數返回當前被內部指針指向的數組單元的值,並不移動指針。如果內部指針指向超出了單元列表的末端,current()
返回FALSE
。
與數組內部指針相關的函數有:
-
next()
說明:next(array &$array):mixed
next()
和current()
的行爲類似,只有一點區別,在返回值之前將內部指針向前移動一位。這意味着它返回的是下一個數組單元的值並將數組指針向前移動了一位。參數:
- array
受影響的數組
返回值:
返回數組內部指針指向的下一個單元的值,或當沒有更多單元時返回
FALSE
- array
-
prev()
說明:將數組的內部指針倒回一位。
prev()
和next()
的行爲類似,只除了它將內部指針倒回一位而不是前移一位。參數:
- array
受影響的數組
返回值:
返回數組內部指針指向的前一個單元的值,或當沒有更多單元時返回
FALSE
。 - array
-
end()
說明:end(array &$array):mixed
end()
將array
的內部指針移動到最後一個單元並返回其值。參數:
- array
受影響的數組。該數組是通過引用傳遞的,因爲它會被這個函數修改。這意味着你必須傳遞一個變量,而不是函數返回的數組,因爲只有真正的變量才能以引用傳遞。
返回值:
返回最後一個元素的值,或者如果是空數組則返回
FALSE
。 - array
-
reset()
說明:reset(array &$array):mixed
reset()
將array
的內部指針倒回到第一個單元並返回第一個數組單元的值。參數:
- array
受影響的數組。 - 返回值:
返回數組第一個單元的值,如果數組爲空則返回
FALSE
。 - array
-
each()
說明:
each(array &$array):array
返回數組中當前的鍵/值對並將數組指針向前移動一步 。
在執行
each()
之後,數組指針將停留在數組中的下一個單元或者當碰到數組結尾時停留在最後一個單元。如果要再用each
遍歷數組,必須使用reset()
。參數:
- array
受影響的數組。
返回值:
返回
array
數組中當前指針位置的鍵/值對並向前移動數組指針。鍵值對被返回爲四個單元的數組,鍵名爲0,1,key和 value。單元 0 和 key 包含有數組單元的鍵名,1 和 value 包含有數據。 如果內部指針越過了數組的末端,則each()
返回FALSE
。 - array
【示例】
<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';
$mode = next($transport)
var_dump($mode); // bool(false)
echo '<br />';
reset($transport);
// array(4) { [1]=> string(4) "foot" ["value"]=> string(4) "foot" [0]=> int(0) ["key"]=> int(0) }
var_dump(each($transport));
echo '<br />';
// array(4) { [1]=> string(4) "bike" ["value"]=> string(4) "bike" [0]=> int(1) ["key"]=> int(1) }
var_dump(each($transport));
?>
程序輸出結果:
代碼解析:
以上代碼中,數組被聲明後內部指針默認指向數組的第一個單元,因此代碼中第一個mode
變量的值是’foot’,next()
將指針向前移動一位,並返回移動後當前單元的值,因此第二個mode
的值是’bike’,經過next()
後數組的指針停留在數組的第二個單元,所以第三個mode
值也是’bike’,prev()
將數組內部指針前移一位,指向了’foot’,end()
將數組指針移動到最後一個單元,指向’plane’。
數組中的鍵名和值
-
從關聯數組中取得鍵名
使用key()
函數可以從關聯數組中返回鍵名。說明:
key(array $array):mixed
返回數組中當前單元的鍵名。
參數:
- array
該數組。
返回值:
返回數組中內部指針指向的當前單元的鍵名。 但它不會移動指針。如果內部指針超過了元素列表尾部,或者數組是空的,
key()
會返回NULL
。【示例】
<?php $array = array( 'fruit1'=>'apple', 'fruit2'=>'orange', 'fruit3'=>'grape', 'fruit4'=>'apple', 'fruit5'=>'apple'); for($i = 0; $i < count($array); $i++) { // 循環數組 echo key($array)."<br />"; // 輸出指針指向當前單元的鍵 next($array); // 將數組指針向前移動一位 } ?>
程序輸出結果:
- array
-
檢查給定鍵名或索引是否存在與數組中
使用array_key_exists()
函數檢查給定鍵名或索引是否存在與數組中。
說明:
array_key_exists(mixed $key, array $array):bool
數組裏有鍵
key
時,array_key_exists() 返回TRUE
。key
可以是任何能作爲數組索引的值。參數:
- key
要檢查的鍵。 - array
一個數組,包含待檢查的鍵。
返回值:
成功時返回
TRUE
, 或者在失敗時返回FALSE
。array_key_exists()僅僅搜索第一維的鍵。多維數組裏嵌套的鍵不會被搜索到。
【示例】
<?php $search_array = array('first'=>1, 'second'=>4); if (array_key_exists('first', $search_array)){ echo "The 'first' element is in the array"; } ?>
程序輸出結果:
- key
-
獲取數組中部門或所有鍵名
使用array_keys()
函數可獲得數組中部分或所有鍵名。
說明:
array_keys(array $input[, mixed $search_value=null[, bool $strict=false]]):array
array_keys() 返回
input
數組中的數字或者字符串的鍵名。如果指定了可選參數search_value
,則只返回該值的鍵名。否則input
數組中的所有鍵名都會被返回。參數:
- input
一個數組,包含了要返回的鍵。 - search_value
如果指定了這個參數,只有包含這些值的鍵纔會被返回。 - strict
判斷在搜索的時候是否該使用嚴格的比較(===)。
返回值:
返回input裏的所有鍵。
【示例】
<?php $array = array(0=>100, "color"=>"red"); echo "<pre>"; print_r(array_keys($array)); $array = array("blue", "red", "green", "blue", "blue"); print_r(array_keys($array, "blue")); // 返回數組中值爲blue的鍵 $array = array( "color"=>array("blue", "red", "green"), "size"=>array("small", "medium", "large")); print_r(array_keys($array)); // 只返回當前維度的數組的鍵 ?>
程序輸出結果:
- input
-
獲取數組中的所有值
使用array_values()
函數可獲得數組中的所有值。
說明:
array_values(array $input):array
array_values()
返回input
數組中所有的值並給其建立數字索引。參數:
- array
該數組。
返回值:
返回包含所有值的索引數組。
【示例】
<?php $array = array("blue", "red", "green"); echo "<pre>"; print_r(array_values($array)); // 返回數組$array中的所有值 ?>
程序輸出結果:
- array
-
搜索給定值返回鍵名
使用array_search()
函數可以在數組中搜索給定的值,如果成功就返回相應的鍵。
說明:
array_search(mixed $needle, array $haystack[, bool $strict=false]):mixed
如果在
haystack
中搜索到了needle
,就返回它的鍵, 否則返回false
。如果needle
在haystack
中不止一次出現,就返回第一個匹配的鍵。要返回所有匹配值的鍵, 應該用array_ keys()加上可選參數search_value
來代替。如果可選參數strict 爲true
,那麼array_search()
將在haystack中
檢查完全相同的元素。這意味着同樣檢查haystack
裏needle
的類型, 並且對象須是同一個實例。參數:
- needle
搜索的值。如果needle是字符串,則比較以區分大小寫的方式進行。 - haystack
這個數組。 - strict
如果可選的第三個參數strict
爲TRUE
,則array_search()
將在haystack
中檢查完全相同的元素。這意味着同樣嚴格比較haystack
裏needle
的類型,並且對象是同一實例。
返回值:
如果找到了
needle
則返回它的鍵,否則返回FALSE
。如果needle
在haystack
中出現不止一次,則返回第一個匹配的鍵。要返回所有匹配值的鍵,應該用array_keys()
加上可選參數search_value
來代替。【示例】
<?php $array = array(0=>'blue', 1=>'red', 2=>'green', 3=>'red'); $key = array_search('green', $array); // 查找數組中值爲green的鍵,此時$key=2; $key = array_search('red', $array); //查找數組中值爲'red'的鍵,此時$key=1 ?>
- needle
數組填充
-
array_pad()
函數
說明:
array_pad(array $array, int $size, mixed $value):array
array_pad()
返回array
的一個拷貝,並用value
將其填補到size
指定的長度。如果size
爲正,則填補到數組的右側,如果爲負則從左側開始填補。如果size
的絕對值小於或等於array
數組的長度則沒有任何填補。有可能一次最多填補1048576 個單元。參數:
- array
需要被填充的原始數組。 - size
新數組的長度。 - value
將被填充的值,只有在 array 的現有長度小於 size 的長度時纔有效。
返回值:
返回
array
用value
填充到size
指定的長度之後的一個副本。如果size
爲正,則填補到數組的右側,如果爲負則從左側開始填補。如果size
的絕對值小於或等於array
數組的長度則沒有任何填補。【示例】
<?php $input = array(12, 10, 9); echo '<pre>'; // 從數組右側開始,用0填充數組到含有5個元素 $result = array_pad($input, 5, 0); print_r($result); // 從數組左側開始,用-1填充數組到含有7個元素 $result = array_pad($input, -7, -1); print_r($result); // 第二個諳熟小於數組長度,不填充 $result = array_pad($input, 2, "noop"); print_r($result); ?>
程序輸出結果:
- array
-
array_fill()
函數
該函數可以用給定的值填充數組。
說明:
array_fill(int $start_index, int $num, mixed $value):array
array_fill()
用value
參數的值將一個數組填充num
個條目,鍵名由start_index
參數指定的開始。參數:
- start_index
返回的數組的第一個索引值。如果start_index
是負數,那麼返回的數組的第一個索引將會是start_index
,而後面索引則從0開始。 - num
插入元素的數量。必須大於或等於0. - value
用來填充的值。
返回值:
返回填充後的數組。
【示例】
<?php // 使用banana填充數組到6個元素,索引鍵由數字5開始 $a = array_fill(5, 6, "banana"); // 使用pear填充數組到4個元素,索引建由-2開始 $b = array_fill(-2, 4, 'pear'); // 用一個數組填充成一個二維數組 $c = array_fill(3, 2, array('green', 'red', 'blue')); echo '<pre>'; print_r($a); print_r($b); print_r($c); ?>
程序輸出結果:
- start_index
-
array_fill_keys()
函數
該函數使用指定的鍵和值填充數組。
語法:
array_fill_keys(array $keys, mixed $value):array
使用
value
參數的值作爲值,使用keys
數組的值作爲鍵來填充一個數組。參數:
- keys
使用該數組的值作爲鍵。非法值將被轉換爲字符串。 - value
填充使用的值。
返回值:
返回填充後的數組
【示例】
<?php $keys = array('foo', 5, 10, 'bar'); // 使用$keys數組的值作爲鍵,banana作爲值重新組建一個數組 $a = array_fill_keys($keys, "banana"); // 使用$keys的值作爲鍵,另一個數組作爲元素,組成一個新的二維數組 $b = array_fill_keys($keys, array('red', 'green', 'blue')); echo '<pre>'; print_r($a); print_r($b); ?>
程序輸出結果:
- keys
從數組中隨機去除一個或多個單元
array_rand()
函數可以從數組中取出一個或多個隨機的單元,並返回隨機條目的一個或多個鍵。
說明:
array_rand(array $array[, int $num=1]):mixed
從數組中取出一個或多個隨機的單元,並返回隨機條目的一個或多個鍵。 它使用了僞隨機數產生算法,所以不適合密碼學場景。
參數:
- array
輸入的數組。 - num
指明瞭想取出多少個單元。
返回值:
如果只取出一個,array_rand()
返回隨機單元的鍵名。否則就返回包含隨機鍵名的數組。完成後,就可以根據隨機的鍵獲取數組的隨機值。取出數量如果超過array
的長度,就會導致E_WARNING
錯誤,並返回NULL
。
【示例】
<?php
$input = array("Neo", "morpheus", "Trinity", "Cypher", "Tank");
// 從$input數組中隨機取出2個單元,組成一個新的數組
$rand_keys = array_rand($input, 2);
echo '<pre>';
print_r($rand_keys);
?>
程序輸出結果:
數組排序與打亂數組
-
sort()
函數
說明:
srot(array &$array[, int $sort_flags=SORT_REGULAR]):bool
本函數對數組進行排序。當本函數結束時數組單元將被從最低到最高重新安排。
參數:
- array
要排序的數組 - sort_flags
可選的第二個參數sort_flags
可以用以下值改變排序的行爲:
排序類型標記:- SORT_REGULAR-正常比較單元(不改變類型)
- SORT_NUMERIC-單元被作爲數字來比較
- SORT_STRING-單元被作爲字符串來比較
- SORT_LOCAL_STRING-根據當前的區域(local)設置來把單元當做字符串比較,可以用
setlocal()
來改變 - SORT_NATURAL-和
natsor()
類似對每個單元以“自然的順序”對字符串進行排序。(PHP5.4.0中新增) - SORT_FLAG_CASE-能夠與SORT_STRING或SORT_NATURAL合併(OR位運算),不區分大小寫排序字符串。
返回值:
成功時返回
TRUE
,或者在失敗時返回FALSE
。【示例】
<?php $fruits = array("lemon", "banana", "apple"); sort($fruits); // 數組排序 echo '<pre>'; print_r($fruits); ?>
程序輸出結果:
- array
-
asort()
函數
說明:
asort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
本函數對數組進行排序,數組的索引保持和單元的關聯。主要用於對那些單元順序很重要的結合數組進行排序。
參數:
- array
輸入數組。 - sort_flags
可以用可選的參數sort_flags
改變排序的行爲,取值與sort()
一樣。
返回值:
成功時返回
TRUE
,或者在失敗時返回FALSE
。【示例】
<?php $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"); asort($fruits); // 數組排序 echo '<pre>'; print_r($fruits); ?>
程序輸入結果:
- array
-
arsort()
函數
說明:
arsort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
本函數對數組進行逆向排序,數組的索引保持和單元的關聯。主要用於對那些單元順序很重要的結合數組進行排序。
參數:
- array
輸入的數組 - srot_flags
可以用可選的參數sort_flags
改變排序的行爲,取值與sort()
一樣。
返回值:
成功時返回
TRUE
,或者在失敗時返回FALSE
。【示例】
<?php $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"); arsort($fruits); // 數組排序 echo '<pre>'; print_r($fruits); ?>
程序輸出結果:
- array
-
rsort()
函數
說明:
rsort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
對數組進行逆向排序,但是不保持索引關係。
參數:
- array
輸入的數組。 - srot_flags
可以用可選的參數sort_flags
改變排序的行爲,取值與sort()
一樣。
返回值:
成功時返回
TRUE
,或者在失敗時返回FALSE
。【示例】
<?php $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"); rsort($fruits); // 數組排序 echo '<pre>'; print_r($fruits); ?>
程序輸出結果:
- array
-
shuffle()
函數
說明:
shuffle(array &$array):bool
本函數打亂(隨機排列單元的順序)一個數組。 它使用的是僞隨機數產生器,並不適合密碼學的場合。
參數:
- array
待操作的數組。
返回值:
成功時返回
TRUE
,或者在失敗時返回FALSE
。【示例】
<?php $numbers = range(1, 20); echo "打亂之前"; foreach($numbers as $number){ echo "$number "; } shuffle($numbers); // 打亂數組順序 echo "<br />打亂之後"; foreach($numbers as $number){ echo "$number "; } ?>
程序輸出結果:
- array
遍歷數組
編程中常用for、foreach、each(PHP7.2已棄用)、list對數組進行遍歷。
-
for循環遍歷數組
【示例】<?php $fruits = array("lemon", "orange", "banana", "apple"); for($i = 0; $i < count($fruits); $i++) { echo current($fruits)."\n"; echo $fruits[$i]."<br />"; } ?>
程序運行結果:
從以上代碼的運行可以看到,for循環遍歷數組的形式沒有改變數組的內部指針。
-
foreach遍歷數組
【示例】<?php $array=[0, 1, 2]; foreach($array as &$val){ //遍歷數組 echo $val; } ?>
以上程序會輸出:012
【示例2】
<?php $array=[0, 1, 2]; foreach($array as &$val){ //遍歷數組,使用current()輸出數組指針指向的當前單元的值 var_dump(current($array)); } ?>
在PHP7中,輸出結果爲:
在PHP7之前的版本中輸出結果爲:
【示例3】<?php $array = [0, 1, 2]; foreach($array as $val){ $var = $val * 2; // 元素值乘以2 } var_dump($array); ?>
程序輸出結果:
通過以上代碼可以看出,foreach循環是對數組的備份進行操作,在循環內部修改數組不會對循環之外訪問數組有影響。但如果是按照引用循環,那麼在循環內部對數組做的修改會影響數組本身。
-
each()和list()
each()函數返回數組中當前的鍵值並將數組指針向前移動。在執行each()之後,數組指針將停留在數組中的下一個單元后者當碰到數組結尾時停留在最後一個單元。如果再要用each遍歷數組,需要使用reset()。<?php echo "<pre>"; $foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese"); $bar1 = each($foo); // 指針向後移動一位 print_r($bar1); echo current($foo); // 當前指針 echo "<br />"; $bar2 = each($foo); print_r($bar2); echo current($foo); ?>
程序輸出結果:
注意:each()函數在PHP7.2中已棄用。
each()函數和list()函數結合使用可以遍歷數組:
【示例】
<?php $fruit = array('a'=>'apple', 'b'=>'banana', 'c'=>'cranberry'); while(list($key, $val)=each($fruit)){ echo "$key=>$val<br />"; } ?>
list()
結構:把數組中的值賦給一組變量。
說明:
list(mixed $var1[, mixed $...]):array
像
array()
一樣,這不是真正的函數,而是語言結構。list()
可以在單次操作內就爲一組變量賦值。在 PHP 7.1.0 之前的版本,
list()
僅能用於數字索引的數組,並假定數字索引從 0 開始。PHP 5 裏,
list()
從最右邊的參數開始賦值;PHP 7 裏,list()
從最左邊的參數開始賦值。 如果你用單純的變量,不用擔心這一點。但是如果你用了具有索引的數組,通常你期望得到的結果和在list()
中寫的一樣是從左到右的,但在 PHP 5 裏實際上不是,它是以相反順序賦值的。
數組的拆分與合併
-
array_chunk()
函數
說明:
array_chunk(array $array, int $size[, bool $preserve_keys=false]):array
將一個數組分割成多個數組,其中每個數組的單元數目由
size
決定。最後一個數組的單元數目可能會少於size
個。參數:
- array
需要操作的數組 - size
每個數組的單元數目 - preserve_kyes
設爲TRUE
,可以使PHP保留輸入數組中原來的鍵名。如果指定爲FALSE
,那每個結果數組將用從零開始的新數字索引。默認值是FALSE
。
返回值:
得到數組是一個多維數組中的單元,其索引從零開始,每一維包含了
size
個元素。如果
size
小於1,會拋出一個E_WARNING
錯誤並返回NULL
。【示例】
<?php echo "<pre>"; $input_array = array('a'=>array('x', 'y'), 'b', 'c', 'd', 'e'); print_r(array_chunk($input_array, 2)); // 設置$preserve_keys的值爲true,保留原來的鍵名 print_r(array_chunk($input_array, 2, true)); ?>
程序輸出結果:
- array
-
array_merge()
函數
該函數可以合併一個或多個數組。
說明:
array_merge(array $array1[, $array $...]):array
array_merge()
將一個或多個數組的單元合併起來,一個數組中的值附加在前一個數組的後面。返回作爲結果的數組。如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將***不會***覆蓋原來的值,而是附加到後面。如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。參數:
- array1
要合併的第一個數組。 - …
要合併的數組列表。
返回值:
返回結果數組。
【示例】
程序輸出結果:
如果想完全保留原有數組並只想將新的數組附加到後面,就用“+”運算符。使用“+”運算符連接數組,連接的數組中鍵名相同時第一個數組的鍵值對將會保留,後面的將被捨棄。
【示例】
<?php $array1 = array(0=>'zero_a', 2=>'two_a', 3=>'three_a'); $array2 = array(1=>'one_b', 3=>'three_b', 4=>'four_b'); $result = $array1 + $array2; var_dump($result); ?>
程序輸出結果:
- array1
增加/刪除數組中的元素
-
array_unshift()
函數
該函數可在數組開頭插入一個或多個單元。
說明:
array_unshift(array &$array[, mixed $...]):int
array_unshift()
將傳入的單元插入到array
數組的開頭。注意單元是作爲整體被插入的,因此傳入單元將保持同樣的順序。所有的數值鍵名將修改爲從零開始重新計數,所有的字符串鍵名保持不變。參數:
- array
輸入的數組 - …
插入的變量
返回值:
返回
array
數組新的單元數目。【示例】
<?php $queue = array('a'=>'orange', 1=>'banana'); array_unshift($queue, "apple", "raspbery"); print_r($queue); ?>
程序輸出結果:
可以看到原始數組中鍵值爲1的單元,此時鍵值已經發生了改變。
- array
-
array_shift()
函數
該函數可以將數組開頭的單元移出數組。
說明:
array_shift(array &$array):mixed
array_shift()
將array
的第一個單元移出並作爲結果返回,將array
的長度減一併將所有其它單元向前移動一位。所有的數字鍵名將改爲從零開始計數,字符串鍵名將不變。使用此函數後會重置(
reset()
)array指針。參數:
- array
輸入的數組。
返回值:
返回移出的值,如果array爲空或不是一個數組則返回NULL。
【示例】
<?php $stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_shift($stack); print_r($stack); ?>
程序輸出結果:
從輸出結果可以看到orange被移出了數組,並且數組的鍵名發生了改變。 - array
-
array_push()
函數
該函數用來將一個或多個單元壓入數組的末尾(入棧)。
說明:
array_push(array &$array, mixed $value1[, mixed $...]):int
array_push()
將array
當成一個棧,並將傳入的變量壓入array
的末尾。array
的長度將根據入棧變量的數目增加。如果用
array_push()
來個數組增加一個單元,不如使用$array[]=$val
的方式,因爲這樣沒有調用函數的額外負擔。如果第一個參數不是數組,該函數會發出一條警告。這和$var[]的行爲不同,後者會新建一個數組。參數:
- array
輸入的數組。 - value1
要壓入數組末尾的第一個值。
返回值:
返回處理之後數組的元素個數。
【示例】
<?php $stack = array("orange", "banana"); $fruit = array_push($stack, "apple", "raspberry"); print_r($stack); ?>
程序輸出結果:
- array
-
array_pop()
函數
該函數可將數組的最後一個單元彈出(出棧)。
說明:
array_pop(array &$array):mixed
array_pop()
彈出並返回array
數組的最後一個單元,並將數組array
的長度減一。參數:
- array
需要彈出棧的數組。
返回值:
返回
array
的最後一個值,如果array
爲空(如果不是一個數組),將會返回NULL
。【示例】
<?php $stack = array("orange", "banana", "apple", "raspberry"); $fruit = array_pop($stack); print_r($stack); ?>
程序輸出結果:
- array
其他常用數組函數
-
array_slice()
函數
該函數從數組中取出一段。
說明:
array_slice(array $array, int $offset[, int $length = NULL[, bool $preserve_keys = false]]):array
array_slice()
返回根據offset
和length
參數所指定的array
數組中的一段序列。參數:
- array
輸入的數組。 - offset
如果該值爲非負,則序列將從數組中的此偏移量開始。如果該值爲負,則序列將從數組中距離末端這麼遠的地方開始。 - length
如果給出了length
並且爲正,則序列中將具有這麼多的單元。如果給出了length
並且爲負,則序列將終止在距離數組末端這麼遠的地方。如果省略,則序列將從offset
開始一直到array
的末端。 - preserve_keys
array_slice()
默認會重新排序並重置數組的數字索引。可以通過將preserve_keys
設爲TRUE
來改變此行爲。
返回值:
返回其中一段。如果
offset
參數大於array
尺寸,就會返回空的array
。【示例】
<?php echo "<pre>"; $input = array("a", "b", "c", "d", "e"); $output = array_slice($input, 2); // 返回"c","d"和"e" $output = array_slice($input, -2, 1); // 返回"d" $output = array_slice($input, 0, 3); // 返回"a","b"和"c" // 注意一下兩個返回數組的鍵名 print_r(array_slice($input, 2, -1)); print_r(array_slice($input, 2, -1, true)); ?>
程序輸出結果:
- array
-
array_splice()
函數
該函數可以把數組的一部分去掉並用其他值取代。
說明:
array_splice(array &$input, int $offset[, int $length = count($input)[, mixed $replacement = array()]]):array
把
input
數組中由offset
和length
指定的單元去掉,如果提供了replacement
參數,則用其中的單元取代。**input
**中的數字鍵名將不被保留。如果replacement
不是數組,會被類型轉換成數組。當傳入的replacement
是個對象或者NULL
,會導致未知行爲出現。參數:
- input
輸入的數組。 - offset
如果offset
爲正,則從input
數組中該值指定的偏移量開始移除。如果offset
爲負,則從input
末尾到該數值指定的偏移量開始移除。 - length
如果省略了length
,則移除數組中從offset
到結尾的所有部分。如果指定了length
並且爲正值,則移除length
個單元。如果length
爲負值,則移除從offset
到數組末尾倒數length
爲止中間所有的單元。如果length
爲零,不會移除單元。小竅門:當給出了replacement
時要移除從offset
到數組末尾所有單元時,用count($input)
作爲length
。 - replacement
如果給出了replacement
數組,則被移除的單元被此數組中的單元替代。如果offset
和length
的組合結果是不會移除任何值,則replacement
數組中的單元將被插入到offset
指定的位置。注意替換數組中的鍵名不保留。如果用來替換replacement
只有一個單元,那麼不需要給它加上array()
,除非該單元本身就是一個數組,一個對象或者NULL
。
返回值:
返回一個包含有被移除單元的數組。
【示例】
<?php echo "<pre>"; $input = array("red", "green", "blue", "yellow"); array_splice($input, 2); print_r($input); // $input現在是array("red", "green") $input = array("red", "green", "blue", "yellow"); array_splice($input, 1, -1); print_r($input); // $input現在是array("red", "yellow"); $input = array("red", "green", "blue", "yellow"); array_splice($input, 1, count($input), "orange"); print_r($input); // $input現在是array("red", "orange"); $input = array("red", "green", "blue", "yellow"); array_splice($input, -1, 1, array("black", "maroon")); print_r($input); // $input現在是array("red", "green", "blue", "black", "maroon") $input = array("red", "green", "blue", "yellow"); array_splice($input, 3, 0, "purple"); print_r($input); // $input現在是array("red", "green", "blue", "purple", "yellow") ?>
程序輸出結果:
- input
-
is_array()
函數
該函數檢測變量是否爲數組。
說明:
is_array(mixed $var):bool
如果
var
是數組,則返回TRUE
,否則返回FALSE
。
【示例】略 -
array_sum()
函數
該函數計算數組中所有值的和。
說明:
array_sum(array $array):number
array_sum()
將數組中所有值的和以整數或浮點數的結果返回。array_sum()
計算數組元素的和時,普通字符串被當做0,而數字類型字符串會轉換成相應整型或浮點型參與計算。
參數:
- array
輸入的數組。
返回值:
所有值的和以整型或浮點型的結果返回,
array
爲空則返回0。【示例】
<?php $a = array('b', 2, 4,'2', 6, 8); echo "sum(a) = " . array_sum($a) . "<br />"; $b = array("a"=>1.2, "b"=>2.3, "c"=>3.4); echo "sum(b) = " . array_sum($b) . "<br />"; ?>
程序輸出結果:
可以看出
$a
中第一個單元’b’被轉換爲了0,而第四個單元’2’被轉換成了整數2。 - array
-
array_product()
函數
該函數用來計算數組中所有值的乘積並返回。函數的用法同array_sum()
類似,此處不再累述。 -
array_flip()
函數
該函數用來交換數組中的鍵和值。
說明:
array_flip(array $array):array
array_flip()
返回一個反轉後的array
,例如array
中的鍵名變成了值,而array
中的值成了鍵名。注意array
中的值需要能夠作爲合法的鍵名(例如需要是integer
或者string
)。如果類型不對,將出現一個警告,並且有問題的鍵/值對將不會出現在結果裏。如果同一個值出現多次,則最後一個鍵名將作爲它的值,其它鍵會被丟棄。參數:
- array
要交換鍵/值對的數組。
返回值:
成功時返回交換後的數組,如果失敗返回
NULL
。【示例】
<?php $input = array("oranges", "apples", "pears"); $flipped = array_flip($input); print_r($flipped); ?>
程序輸出結果:
【示例2】
<?php $input = array("a"=>1, "b"=>1, "c"=>2); $flipped = array_flip($input); print_r($flipped); ?>
程序輸出結果:
- array