PHP7語言基礎——數組

使用數組

數組的本質是用來存儲、管理和操作一組變量。PHP中的數組實際上是一個有序映射,映射是一種把values關聯到keys的類型。

數組類型

PHP中有兩種類型的數組,即索引數組和關聯數組。索引數組的鍵由數字組成,在沒有特別指定時,數組默認爲索引數組。關聯數組的鍵由字符串和數字混合組成。

  1. 關聯數組:

    $array = array('a'=>'foo', 'b'=>'bar')
    
  2. 索引數組:

    $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中的元素lilyTomAndy對應的值分別是一個以爲數組,這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的值爲TRUEin_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_countableNULL則結果是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

與數組內部指針相關的函數有:

  1. next()
    說明:

    next(array &$array):mixed
    

    next()current()的行爲類似,只有一點區別,在返回值之前將內部指針向前移動一位。這意味着它返回的是下一個數組單元的值並將數組指針向前移動了一位。

    參數:


    • array
      受影響的數組

    返回值:


    返回數組內部指針指向的下一個單元的值,或當沒有更多單元時返回FALSE

  2. prev()
    說明:

    將數組的內部指針倒回一位。prev()next()的行爲類似,只除了它將內部指針倒回一位而不是前移一位。

    參數:


    • array
      受影響的數組

    返回值:


    返回數組內部指針指向的前一個單元的值,或當沒有更多單元時返回 FALSE

  3. end()
    說明:

    end(array &$array):mixed
    

    end()array的內部指針移動到最後一個單元並返回其值。

    參數:


    • array
      受影響的數組。該數組是通過引用傳遞的,因爲它會被這個函數修改。這意味着你必須傳遞一個變量,而不是函數返回的數組,因爲只有真正的變量才能以引用傳遞。

    返回值:


    返回最後一個元素的值,或者如果是空數組則返回 FALSE

  4. reset()
    說明:

    reset(array &$array):mixed
    

    reset()array的內部指針倒回到第一個單元並返回第一個數組單元的值。

    參數:


    • array
      受影響的數組。
    • 返回值:

    返回數組第一個單元的值,如果數組爲空則返回FALSE

  5. each()
    說明:


    each(array &$array):array
    

    返回數組中當前的鍵/值對並將數組指針向前移動一步 。

    在執行 each()之後,數組指針將停留在數組中的下一個單元或者當碰到數組結尾時停留在最後一個單元。如果要再用each 遍歷數組,必須使用 reset()

    參數:


    • array
      受影響的數組。

    返回值:


    返回 array 數組中當前指針位置的鍵/值對並向前移動數組指針。鍵值對被返回爲四個單元的數組,鍵名爲01keyvalue。單元 0key 包含有數組單元的鍵名,1value 包含有數據。 如果內部指針越過了數組的末端,則 each()返回 FALSE

【示例】

<?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’。

數組中的鍵名和值

  1. 從關聯數組中取得鍵名
    使用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);					// 將數組指針向前移動一位
    }
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  2. 檢查給定鍵名或索引是否存在與數組中
    使用array_key_exists()函數檢查給定鍵名或索引是否存在與數組中。
    說明:


    array_key_exists(mixed $key, array $array):bool
    

    數組裏有鍵 key 時,array_key_exists() 返回 TRUEkey 可以是任何能作爲數組索引的值。

    參數:


    • 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";
    }
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  3. 獲取數組中部門或所有鍵名
    使用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));		// 只返回當前維度的數組的鍵
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  4. 獲取數組中的所有值
    使用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中的所有值
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  5. 搜索給定值返回鍵名
    使用array_search()函數可以在數組中搜索給定的值,如果成功就返回相應的鍵。
    說明:


    array_search(mixed $needle, array $haystack[, bool $strict=false]):mixed
    

    如果在haystack中搜索到了needle,就返回它的鍵, 否則返回false。如果needlehaystack中不止一次出現,就返回第一個匹配的鍵。要返回所有匹配值的鍵, 應該用array_ keys()加上可選參數search_value來代替。如果可選參數strict 爲true ,那麼array_search()將在haystack中檢查完全相同的元素。這意味着同樣檢查haystackneedle 的類型, 並且對象須是同一個實例。

    參數:


    • needle
      搜索的值。如果needle是字符串,則比較以區分大小寫的方式進行。
    • haystack
      這個數組。
    • strict
      如果可選的第三個參數strictTRUE,則array_search()將在haystack中檢查完全相同的元素。這意味着同樣嚴格比較haystackneedle的類型,並且對象是同一實例。

    返回值:


    如果找到了 needle 則返回它的鍵,否則返回 FALSE。如果 needlehaystack中出現不止一次,則返回第一個匹配的鍵。要返回所有匹配值的鍵,應該用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
    ?>
    

數組填充

  1. 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 的長度時纔有效。

    返回值:


    返回arrayvalue填充到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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  2. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  3. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

從數組中隨機去除一個或多個單元

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);
?>

程序輸出結果:

在這裏插入圖片描述

數組排序與打亂數組

  1. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  2. 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);
    ?>
    

    程序輸入結果:

    在這裏插入圖片描述

  3. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  4. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  5. 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 ";
    }
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

遍歷數組

編程中常用for、foreach、each(PHP7.2已棄用)、list對數組進行遍歷。

  1. for循環遍歷數組
    【示例】

    <?php
    $fruits = array("lemon", "orange", "banana", "apple");
    for($i = 0; $i < count($fruits); $i++) {
    	echo current($fruits)."\n";
    	echo $fruits[$i]."<br />";
    }
    ?>
    

    程序運行結果:

    在這裏插入圖片描述

    從以上代碼的運行可以看到,for循環遍歷數組的形式沒有改變數組的內部指針。

  2. 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循環是對數組的備份進行操作,在循環內部修改數組不會對循環之外訪問數組有影響。

    但如果是按照引用循環,那麼在循環內部對數組做的修改會影響數組本身。

  3. 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 裏實際上不是,它是以相反順序賦值的。

數組的拆分與合併

  1. 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));
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  2. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

增加/刪除數組中的元素

  1. 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的單元,此時鍵值已經發生了改變。

  2. 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被移出了數組,並且數組的鍵名發生了改變。

  3. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  4. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

其他常用數組函數

  1. array_slice()函數
    該函數從數組中取出一段。
    說明:


    array_slice(array $array, int $offset[, int $length = NULL[, bool $preserve_keys = false]]):array
    

    array_slice()返回根據 offsetlength 參數所指定的 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));
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  2. array_splice()函數
    該函數可以把數組的一部分去掉並用其他值取代。
    說明:


    array_splice(array &$input, int $offset[, int $length = count($input)[, mixed $replacement = array()]]):array
    

    input數組中由offsetlength指定的單元去掉,如果提供了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數組,則被移除的單元被此數組中的單元替代。如果offsetlength的組合結果是不會移除任何值,則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")
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

  3. is_array()函數
    該函數檢測變量是否爲數組。
    說明:


    is_array(mixed $var):bool
    

    如果var是數組,則返回TRUE,否則返回FALSE
    【示例】略

  4. 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。

  5. array_product()函數
    該函數用來計算數組中所有值的乘積並返回。函數的用法同array_sum()類似,此處不再累述。

  6. 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);
    ?>
    

    程序輸出結果:

    在這裏插入圖片描述

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