1. 程式人生 > >php中的陣列操作函式整理

php中的陣列操作函式整理

PHP 中的陣列實際上是一個有序圖。圖是一種把 values 對映到 keys的型別。此型別在很多方面做了優化,因此可以把它當成真正的陣列來使用,或列表(向量),散列表(是圖的一種實現),字典,集合,棧,佇列以及更多可能性。因為可以用另一個 PHP 陣列作為值,也可以很容易地模擬樹.

Array([key => value, key => value, key => value, key => value) // key 可以是 integer 或者 string // value 可以是任何值
array_change_key_case -- 返回字串鍵名全為小寫或大寫的陣列
array_chunk -- 將一個數組分割成多個
array_combine -- 建立一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
array_count_values -- 統計陣列中所有的值出現的次數
array_diff_assoc -- 帶索引檢查計算陣列的差集
array_diff_key -- 使用鍵名比較計算陣列的差集
array_diff_uassoc -- 用使用者提供的回撥函式做索引檢查來計算陣列的差集
array_diff_ukey -- 用回撥函式對鍵名比較計算陣列的差集
array_diff -- 計算陣列的差集
array_fill -- 用給定的值填充陣列
array_filter -- 用回撥函式過濾陣列中的單元
array_flip -- 交換陣列中的鍵和值
array_intersect_assoc -- 帶索引檢查計算陣列的交集
array_intersect_key -- 使用鍵名比較計算陣列的交集
array_intersect_uassoc -- 帶索引檢查計算陣列的交集,用回撥函式比較索引
array_intersect_ukey -- 用回撥函式比較鍵名來計算陣列的交集
array_intersect -- 計算陣列的交集
array_key_exists -- 檢查給定的鍵名或索引是否存在於陣列中
array_keys -- 返回陣列中所有的鍵名
array_map -- 將回調函式作用到給定陣列的單元上
array_merge_recursive -- 遞迴地合併一個或多個數組
array_merge -- 合併一個或多個數組
array_multisort -- 對多個數組或多維陣列進行排序
array_pad -- 用值將陣列填補到指定長度
array_pop -- 將陣列最後一個單元彈出(出棧)
array_product -- 計算陣列中所有值的乘積
array_push -- 將一個或多個單元壓入陣列的末尾(入棧)
array_rand -- 從陣列中隨機取出一個或多個單元
array_reduce -- 用回撥函式迭代地將陣列簡化為單一的值
array_reverse -- 返回一個單元順序相反的陣列
array_search -- 在陣列中搜索給定的值,如果成功則返回相應的鍵名
array_shift -- 將陣列開頭的單元移出陣列
array_slice -- 從陣列中取出一段
array_splice -- 把陣列中的一部分去掉並用其它值取代
array_sum -- 計算陣列中所有值的和
array_udiff_assoc -- 帶索引檢查計算陣列的差集,用回撥函式比較資料
array_udiff_uassoc -- 帶索引檢查計算陣列的差集,用回撥函式比較資料和索引
array_udiff -- 用回撥函式比較資料來計算陣列的差集
array_uintersect_assoc -- 帶索引檢查計算陣列的交集,用回撥函式比較資料
array_uintersect_uassoc -- 帶索引檢查計算陣列的交集,用回撥函式比較資料和索引
array_uintersect -- 計算陣列的交集,用回撥函式比較資料
array_unique -- 移除陣列中重複的值
array_unshift -- 在陣列開頭插入一個或多個單元
array_values -- 返回陣列中所有的值
array_walk_recursive -- 對陣列中的每個成員遞迴地應用使用者函式
array_walk -- 對陣列中的每個成員應用使用者函式
array -- 新建一個數組
arsort -- 對陣列進行逆向排序並保持索引關係
asort -- 對陣列進行排序並保持索引關係
compact -- 建立一個數組,包括變數名和它們的值
count (sizeof)-- 計算陣列中的單元數目或物件中的屬性個數
current -- 返回陣列中的當前單元
each -- 返回陣列中當前的鍵/值對並將陣列指標向前移動一步
end -- 將陣列的內部指標指向最後一個單元
extract -- 從陣列中將變數匯入到當前的符號表
in_array -- 檢查陣列中是否存在某個值
key -- 從關聯陣列中取得鍵名
krsort -- 對陣列按照鍵名逆向排序
ksort -- 對陣列按照鍵名排序
list -- 把陣列中的值賦給一些變數
natcasesort -- 用“自然排序”演算法對陣列進行不區分大小寫字母的排序
natsort -- 用“自然排序”演算法對陣列排序 next -- 將陣列中的內部指標向前移動一位
pos -- current() 的別名 prev -- 將陣列的內部指標倒回一位 range -- 建立一個包含指定範圍


=============================================================================================
輸出陣列
boolean print_r(var)

建立陣列
1.array $a=array("a","b");
2.list
    $line="a|b|c";
    list($a,$b,$c)=explode("|",$line);
3.array range(low,high,step)
    $a=range(0,6) <==> $a=(0,1,2,3,4,5,6);
    $a=range(0,6,2) <==> $a=(0,2,4,6)

測試陣列
boolean is_array(arr)

增加或刪除陣列元素
1.$arrayname[]
2.int array_push(tar,var) 把var放到陣列tar的末尾
3.mixed array_pop(tar) 返回並刪除陣列tar的最後一個元素
4.mixed array_shift(tar) 返回並刪除陣列tar的第一個元素
5.int array_shift(tar,var) 將var增加到陣列tar的最前面
6.array array_pad(tar,legth,pad) 更改陣列tar,將其大小更改為legth,並且向右新增值為pad.如果當前大小小於或等於legth則不作任何操作。

定位陣列元素
1.boolean in_array(needle,haystack[,strict]) 返回鍵needle是否在haystak中
2.array array_key(tar [,search_value]) 返回一個由陣列tar中所有鍵組成的陣列
3.boolean array_key_exists(key,tar) 如果陣列tar存在鍵key返回true
4.array array_values(tar) 返回一個包含陣列tar所有值得陣列
5.miexd array_search(needle,hastack [,strict]) 返回值needl是否在hastack中存在

遍歷陣列
1.key() 取元素的鍵名
2.mixed reset(arr) 將陣列arr的指標指向第一個元素
3.array each(arr) 返回陣列arr中的當前鍵/值,並把指標移到下一個元素
4.mixed current(arr) 返回陣列arr中的當前鍵/值
5.mixed end(arr) 把陣列arr的指標指向最後一個元素,並返回最後一個元素
6.mixed next(arr) 把陣列arr的指標指向下一個元素
7.mixed prev(tar) 將陣列tar中的指標指向前一個元素,並返回這個元素
8.boolean array_walk(arr,cb,userdata) 將陣列arr一次傳遞到自定義函式cb中
9.array array_reverse(arr,keys) 把陣列arr中的值逆序排列
10.array array_flip(arr) 將陣列tar中的鍵/值倒置

確定陣列大小和唯一性
1.integer const(arr[,mode]) 返回陣列arr的值總數。如果mode=1則可返回多維陣列的值總數
2.array array_count_values(arr) 返回陣列arr中的值的出現頻率
3.array array_unique(arr) 刪除陣列arr中的重複值

***********陣列排序 *******
1.void sort(arr [,flag]) 對陣列arr進行升序排序。注:排序後鍵/值不再對應
2.void natsort(arr) p1,p10,p2,p3 >>> p1,p2,p3,p10
3.void natcasesort(arr) 同natsort,但這個不區分大小寫
4.void rsort(arr [,flag]) 同sort,這個降序排列。
5.void asort(arr [,flag]) 同sort,只是這個鍵/值對應
6.boolean array_multisort(arr,arg...) 同時對多個鍵/值進行排序
7.void arsort(arr [,flag]) 同rsort,但這個鍵/值對應
8.integer ksort(arr [,flag]) 按陣列arr鍵進行升序排序
9.integer krsort(arr [,flag]) 按陣列arr鍵進行降序排序
10.void usort(arr,cb) 按自定義函式cb的規則對arr排序

合併、拆分、接合、分解陣列
1.array array_combine(keys,values) 使用兩個陣列的值,組成一個鍵/值對應的陣列
2.array array_merge(arr,arr.....) 合併多個數組,對相同的鍵值進行覆蓋
3.array array_merge_recursive(arr,arr...) 合併多個數組,對相同的鍵生成一個子陣列
4.array array_slice(arr,offset [,length]) 返回一個在陣列arr中指定部分的陣列
5.array array_splice(input,offset,length,repl) 刪除陣列中指定的部分,並返回刪除的部分
6.array array_intersect(arr,arr...) 返回多個數組中都存在的值
7.array array_intersect_assoc(arr,arr...) 返回多個數組中都存在的鍵/值
8.array array_diff(arr1,arr2...) 返回在陣列arr1中存在,在其他陣列中不存在的值
9.array array_diff_assoc(arr1,arr2...) 返回在陣列arr1中存在,在其他陣列中不存在的鍵/值

其他函式
1.mixed array_rand(arr[,num]) 隨機返回一個數組arr中的鍵/值
2.void shuffle(arr) 把陣列arr中的內容重新打亂
3.mixed array_sum(arr) 返回陣列arr中所有值得累加值

========================================================

一、陣列操作的基本函式
陣列的鍵名和值
array_values($arr);獲得陣列的值
array_keys($arr);獲得陣列的鍵名
array_flip($arr);陣列中的值與鍵名互換(如果有重複前面的會被後面的覆蓋)
in_array("apple",$arr);在陣列中檢索apple
array_search("apple",$arr);在陣列中檢索apple ,如果存在返回鍵名
array_key_exists("apple",$arr);檢索給定的鍵名是否存在陣列中
isset($arr[apple]):檢索給定的鍵名是否存在陣列中

陣列的內部指標
current($arr);返回陣列中的當前單元
pos($arr);返回陣列中的當前單元
key($arr);返回陣列中當前單元的鍵名
prev($arr);將陣列中的內部指標倒回一位
next($arr);將陣列中的內部指標向前移動一位
end($arr);將陣列中的內部指標指向最後一個單元
reset($arr;將陣列中的內部指標指向第一個單元
each($arr);將返回陣列當前元素的一個鍵名/值的構造陣列,並使陣列指標向前移動一位
list($key,$value)=each($arr);獲得陣列當前元素的鍵名和值

陣列和變數之間的轉換
extract($arr);用於把陣列中的元素轉換成變數匯入到當前檔案中,鍵名當作變數名,值作為變數值
注:(第二個引數很重要,可以看手冊使用)使用方法  echo $a;
compact(var1,var2,var3);用給定的變數名建立一個數組

二、陣列的分段和填充
陣列的分段
array_slice($arr,0,3);可以將陣列中的一段取出,此函式忽略鍵名
array_splice($arr,0,3,array("black","maroon"));可以將陣列中的一段取出,與上個函式不同在於返回的序列從原陣列中刪除

分割多個數組
array_chunk($arr,3,TRUE);可以將一個數組分割成多個,TRUE為保留原陣列的鍵名

陣列的填充
array_pad($arr,5,'x');將一個數組填補到制定長度

三、陣列與棧
array_push($arr,"apple","pear");將一個或多個元素壓入陣列棧的末尾(入棧),返回入棧元素的個數
array_pop($arr);將陣列棧的最後一個元素彈出(出棧)

四、陣列與列隊
array_shift($arr);陣列中的第一個元素移出並作為結果返回(陣列長度減1,其他元素向前移動一位,數字鍵名改為從零技術,文字鍵名不變)
array_unshift($arr,"a",array(1,2));在陣列的開頭插入一個或多個元素

五、回撥函式
array_walk($arr,'function','words');使用使用者函式對陣列中的每個成員進行處理(第三個引數傳遞給回撥函式function)
array_mpa("function",$arr1,$arr2);可以處理多個數組(當使用兩個或更多陣列時,他們的長度應該相同)
array_filter($arr,"function");使用回撥函式過濾陣列中的每個元素,如果回撥函式為TRUE,陣列的當前元素會被包含在返回的結果陣列中,陣列的鍵名保留不變
array_reduce($arr,"function","*");轉化為單值函式(*為陣列的第一個值)

六、陣列的排序
通過元素值對陣列排序
sort($arr);由小到大的順序排序(第二個引數為按什麼方式排序)忽略鍵名的陣列排序
rsort($arr);由大到小的順序排序(第二個引數為按什麼方式排序)忽略鍵名的陣列排序
usort($arr,"function");使用使用者自定義的比較函式對陣列中的值進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)忽略鍵名的陣列排序
asort($arr);由小到大的順序排序(第二個引數為按什麼方式排序)保留鍵名的陣列排序
arsort($arr);由大到小的順序排序(第二個引數為按什麼方式排序)保留鍵名的陣列排序
uasort($arr,"function");使用使用者自定義的比較函式對陣列中的值進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)保留鍵名的陣列排序

通過鍵名對陣列排序
ksort($arr);按照鍵名正序排序
krsort($arr);按照鍵名逆序排序
uksort($arr,"function");使用使用者自定義的比較函式對陣列中的鍵名進行排序(function中有兩個引數,0表示相等,正數表示第一個大於第二個,負數表示第一個小於第二個)

自然排序法排序
natsort($arr);自然排序(忽略鍵名)
natcasesort($arr);自然排序(忽略大小寫,忽略鍵名)

七、陣列的計算
陣列元素的求和
array_sum($arr);對陣列內部的所有元素做求和運算

陣列的合併
array_merge($arr1,$arr2);合併兩個或多個數組(相同的字串鍵名,後面的覆蓋前面的,相同的數字鍵名,後面的不會做覆蓋操作,而是附加到後面)
“+”$arr1+$arr2;對於相同的鍵名只保留後一個
array_merge_recursive($arr1,$arr2);遞迴合併操作,如果陣列中有相同的字串鍵名,這些值將被合併到一個數組中去。如果一個值本身是一個數組,將按照相應的鍵名把它合併為另一個數組。當陣列具有相同的陣列鍵名時,後一個值將不會覆蓋原來的值,而是附加到後面

陣列的差集
array_diff($arr1,$arr2);返回差集結果陣列
array_diff_assoc($arr1,$arr2,$arr3);返回差集結果陣列,鍵名也做比較

陣列的交集
array_intersect($arr1,$arr2);返回交集結果陣列
array_intersect_assoc($arr1,$arr2);返回交集結果陣列,鍵名也做比較

八、其他的陣列函式
range(0,12);建立一個包含指定範圍單元的陣列
array_unique($arr);移除陣列中重複的值,新的陣列中會保留原始的鍵名
array_reverse($arr,TRUE);返回一個單元順序與原陣列相反的陣列,如果第二個引數為TRUE保留原來的鍵名
//srand((float)microtime()*10000000); 隨機種子觸發器
array_rand($arr,2);從陣列中隨機取出一個或 多個元素
shuffle($arr);將陣列的順序打亂
本類函式允許用多種方法來運算元組和與之互動。陣列的本質是儲存,管理和操作一組變數。
PHP 支援一維和多維陣列,可以是使用者建立或由另一個函式建立。有一些特定的資料庫處理函式可以從資料庫查詢中生成陣列,還有一些函式返回陣列。

array_change_key_case — 返回字串鍵名全為小寫或大寫的陣列
array_chunk — 將一個數組分割成多個
array_combine — 建立一個數組,用一個數組的值作為其鍵名,另一個數組的值作為其值
array_count_values — 統計陣列中所有的值出現的次數
array_diff_assoc — 帶索引檢查計算陣列的差集
array_diff_key — 使用鍵名比較計算陣列的差集
array_diff_uassoc — 用使用者提供的回撥函式做索引檢查來計算陣列的差集
array_diff_ukey — 用回撥函式對鍵名比較計算陣列的差集
array_diff — 計算陣列的差集
array_fill_keys — Fill an array with values, specifying keys
array_fill — 用給定的值填充陣列
array_filter — 用回撥函式過濾陣列中的單元
array_flip — 交換陣列中的鍵和值
array_intersect_assoc — 帶索引檢查計算陣列的交集
array_intersect_key — 使用鍵名比較計算陣列的交集
array_intersect_uassoc — 帶索引檢查計算陣列的交集,用回撥函式比較索引
array_intersect_ukey — 用回撥函式比較鍵名來計算陣列的交集
array_intersect — 計算陣列的交集
array_key_exists — 檢查給定的鍵名或索引是否存在於陣列中
array_keys — 返回陣列中所有的鍵名
array_map — 將回調函式作用到給定陣列的單元上
array_merge_recursive — 遞迴地合併一個或多個數組
array_merge — 合併一個或多個數組
array_multisort — 對多個數組或多維陣列進行排序
array_pad — 用值將陣列填補到指定長度
array_pop — 將陣列最後一個單元彈出(出棧)
array_product — 計算陣列中所有值的乘積
array_push — 將一個或多個單元壓入陣列的末尾(入棧)
array_rand — 從陣列中隨機取出一個或多個單元
array_reduce — 用回撥函式迭代地將陣列簡化為單一的值
array_reverse — 返回一個單元順序相反的陣列
array_search — 在陣列中搜索給定的值,如果成功則返回相應的鍵名
array_shift — 將陣列開頭的單元移出陣列
array_slice — 從陣列中取出一段
array_splice — 把陣列中的一部分去掉並用其它值取代
array_sum — 計算陣列中所有值的和
array_udiff_assoc — 帶索引檢查計算陣列的差集,用回撥函式比較資料
array_udiff_uassoc — 帶索引檢查計算陣列的差集,用回撥函式比較資料和索引
array_udiff — 用回撥函式比較資料來計算陣列的差集
array_uintersect_assoc — 帶索引檢查計算陣列的交集,用回撥函式比較資料
array_uintersect_uassoc — 帶索引檢查計算陣列的交集,用回撥函式比較資料和索引
array_uintersect — 計算陣列的交集,用回撥函式比較資料
array_unique — 移除陣列中重複的值
array_unshift — 在陣列開頭插入一個或多個單元
array_values — 返回陣列中所有的值
array_walk_recursive — 對陣列中的每個成員遞迴地應用使用者函式
array_walk — 對陣列中的每個成員應用使用者函式
array — 新建一個數組
arsort — 對陣列進行逆向排序並保持索引關係
asort — 對陣列進行排序並保持索引關係
compact — 建立一個數組,包括變數名和它們的值
count — 計算陣列中的單元數目或物件中的屬性個數
current — 返回陣列中的當前單元
each — 返回陣列中當前的鍵/值對並將陣列指標向前移動一步
end — 將陣列的內部指標指向最後一個單元
extract — 從陣列中將變數匯入到當前的符號表
in_array — 檢查陣列中是否存在某個值
key — 從關聯陣列中取得鍵名
krsort — 對陣列按照鍵名逆向排序
ksort — 對陣列按照鍵名排序
list — 把陣列中的值賦給一些變數
natcasesort — 用“自然排序”演算法對陣列進行不區分大小寫字母的排序
natsort — 用“自然排序”演算法對陣列排序
next — 將陣列中的內部指標向前移動一位
pos — current() 的別名
prev — 將陣列的內部指標倒回一位
range — 建立一個包含指定範圍單元的陣列
reset — 將陣列的內部指標指向第一個單元
rsort — 對陣列逆向排序
shuffle — 將陣列打亂
sizeof — count() 的別名
sort — 對陣列排序
uasort — 使用使用者自定義的比較函式對陣列中的值進行排序並保持索引關聯
uksort — 使用使用者自定義的比較函式對陣列中的鍵名進行排序
usort — 使用使用者自定義的比較函式對陣列中的值進行排序
使用陣列
在前面的章節中,我們所介紹的變數都是標量變數,這些變數只能儲存單個數據。陣列是一個可以儲存一組或一系列數值的變數。一個數組可以具有許多個元素。每個元素有一個值,例如文字、數字或另一個數組。一個包含其他陣列的陣列稱為多維陣列。

3.1 什麼是陣列
一個標量變數就是一個用來儲存數值的命名區域。同樣,一個數組就是一個用來儲存一系列變數值的命名區域,因此,可以使用陣列組織標量變數。
儲存在陣列中的值稱為陣列元素。每個陣列元素有一個相關的索引(也稱為關鍵字),它可以用來訪問元素。在大多數程式語言中,陣列都具有數字索引,而且這些索個通常是從0或1開始的。

3.2 數字索引陣列
在PHP中,數字索引的預設值是從0開始的,當然也可以改變它。

3.2.1 數字索引陣列的初始化
$porducts = array( 'Tires', 'Oil', 'Spark Plugs' );
就像echo語句一樣,array()實際上是一個語言結構,而不是一個函式。
根據對陣列內容的需求不同,可能不需要再像以上例子一樣對它們進行手工的初始化操作。如果所需資料儲存在另一個數組中,可以使用運算子“=”簡單地將陣列複製到另一個數組。
如果需要將按升序排列的數字儲存在一個數組中,可以使用range()函式自動建立這個陣列。如下這行程式碼將建立一個從1到10的數字陣列:$numbers = range(1,10);
range()函式具有一個可選的第三個引數,這個引數允許設定值之間的步驟。例如,如需建立一個1到10之間的奇數陣列,可以使用如下程式碼:$odds = range(1,10,2);
range()函式也可以對字元進行操作,如:$letters = range('a', 'z');

3.2.2 訪問陣列的內容
要訪問一個變數的內容,可以直接使用其名稱。如果該變數是一個數組,可以使用變數名稱和關鍵字或索引的組合來訪問其內容。關鍵字或索引將指定我們要訪問的變數。索引在變數名稱後面用方括號括起來。
在預設的情況下,0元素是陣列的第一個元素。
請注意,雖然PHP的字串解析功能非常強大和智慧,但是可能會引起混淆。當你將陣列或其他變數嵌入雙引號中的字串時,如果不能正確解釋它們,可以將它們放置在雙引號之外,或者查詢第4章的“字串操作與正則表示式”獲得更復雜的語法。
就像PHP的其他變數一樣,陣列不需要預先初始化或建立。在第一次使用它們的時候,它們會自動建立。

3.2.3. 使用迴圈訪問陣列
由於陣列使用有序的數字作為索引,所以使用一個for迴圈就可以很容易地顯示陣列的內容。
for ($i=0; $i<3; $i++)
echo "$products[$i]";
使用一個簡單的迴圈就可以訪問每個元素是數字索引陣列的一個非常好的特性。也可以使用foreach迴圈,這個迴圈語句是專門為陣列而設計的。如:
foreach ($products as $current)
echo $current. ' ';

3.3 使用不同索引的陣列
PHP還支援相關陣列。在相關陣列中,可以將每個變數值與任何關鍵字或索引關聯起來。

3.3.1 初始化相關陣列
如下所示的程式碼可以建立一個以產品名稱作為關鍵字、以價格作為值的相關陣列:
$prices = array( 'Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 );
關鍵字和值之間的符號只是一個大於號與等於符號。

3.3.2 訪問陣列元素
同樣,可以使用變數名稱和關鍵字來訪問陣列的內容。例如$prices['Tires']。

3.3.3 使用迴圈語句
因為相關陣列的索引不是數字,因此無法在for迴圈語句中使用一個簡單的計數器對陣列進行操作。但是可以使用foreach迴圈或list()和each()結構。
當使用foreach迴圈語句對相關陣列進行操作時,foreach()迴圈具有不同的結構。可以按如下方式使用關鍵字:
foreach ($prices as $key => $value)
echo $key.'=>'.$value.'<br />';
如下所示的程式碼將使用each()結構列印$prices陣列的內容:
while( $element = each($prices))
{
echo $element['key'];
echo ' - ';
echo $element['value'];
echo '<br />';
}
each()函式將返回陣列的當前元素,並將下一個元素作為當前元素。因為在while迴圈中呼叫each()函式,它將按順序返回陣列中每個元素,並且當它到達陣列末尾時,迴圈操作將終止。
在這段程式碼中,變數$element是一個數組。當呼叫each()時,它將返回一個帶有4個數值和4個指向陣列位置的索引的陣列。位置key和0包含了當前元素的關鍵字,而位置value和1包含了當前元素的值。雖然這與選哪一種方法沒什麼不同,但我們選擇了使用命名位置,而不是數字索引位置。
此外,還有一種更為高階和常見的方式來完成相同的操作。函式list()可以用來將一個數組分解為一系列的值。可以按照如下方式將函式each()返回的兩個值分開:list( $product, $price) = each( $price);
以上程式碼使用each()從$prices陣列中取出當前元素,並且將它作為陣列返回,然後再指向下一個元素。它還使用list()將從each()返回的陣列中所包含0、1兩個元素變為兩個名為$product和$price的新蠻量。
我們可以迴圈遍歷整個$prices陣列,使用如下所示的簡短指令碼顯示它的內容:
while(list($prodct, $pirce) = each($prices))
echo "$product - $price<br />";
這段程式碼的輸出結果與前面指令碼的輸出結果相同,但它更容易閱讀,因為list()允許為新變數命名。
需要注意的一點是,當使用each()函式時,陣列將記錄當前元素。如果希望在相同的指令碼中兩次使用該陣列,就必須使用函式reset()將當前元素重新設定到陣列開始處。要再次遍歷prices陣列,可以使用如下所示的程式碼:
reset($prices);
while(list($product, $price) = each($prices))
echo "$product - $price<br />";

3.4 陣列操作符
+聯合,==等價,===恆等,!=不等價,<>不等價,!==不恆等。
聯合操作符嘗試將$b中的元素新增到$a的末尾。如果$b中的元素與$a中的一些元素具有相同的索引,它們將不會被新增。即$a中的元素將不會被覆蓋。

3.5 多維陣列
陣列不一定就是一個關鍵字和值的簡單列表——陣列中的每個位置還可以儲存另一個數組。使用這種方法,可以建立一個二維陣列。可以把二維陣列當成一個矩陣,或者是一個具有寬度和高度或者行和列的網路。

3.6 陣列排序

3.6.1 使用sort()函式
sort()函式是區分字母大小寫的。所有的大家字母都在小寫字母的前面。所以‘A’小於‘Z’,而'Z'小於‘a’。
該函式的第二個引數是可選的。這個可選引數可以傳遞SORT_REGULAR(預設值)、SORT_NUMERIC或SORT_STRING。指定排序型別的功能是非常有用的,例如,當要比較可能包含有數字2和12的字串時。從數學角度看,2要小於12,但是作為字串,‘12’卻要小於‘2’。

3.6.2 使用asort()函式和ksort()函式對相關陣列排序
函式asort()根據陣列的每個元素值進行排序。ksort()函式是按關鍵字排序而不是按值排序。

3.6.3 反向排序
函式rsort()將一個一維數字索引陣列按降序排序。函式arsort()將一個一維相關陣列按每個元素值的降序排序。函式krsort()針根據陣列元素的關鍵字將一維陣列按照降序排序。
為了訪問一個一維陣列中的資料,需要使用陣列的名稱和元素的索引,除了一個元素具有兩個索引——行和列外,二維陣列和一維陣列是類似的。
可以使用雙重for迴圈來實現同樣的效果:
for ( $row=0; $row<3; $row++ )
{
for ( $column=0; $column<3; $column++ )
{
echo '|'.$products[$row][$column];
|
echo '|<br />';
}
如果對一個大陣列使用這種程式碼,那麼將簡潔得多。
你可能更喜歡建立列名稱來代替數字。可以使用如下程式碼:
$products = array ( array ( 'Code'=>'TIR', 'Descrīption'=>'Tires', 'Price'=>100 ), array ( 'Code'=>'OIL', 'Descrīption'=>'Oil', 'Price'=>10 ), array ( 'Code'=>'SPK', 'Descrīption'=>'Spark Plugs', 'Price'=>4 ) };
如果希望檢索單個值,那麼使用這個陣列會容易得多。請記住,將所描述的內容儲存到用它的名稱命名的列中,與將其儲存到所謂的第一列中相比,前者更容易記憶。使用描述性索引,不需要記住某個元素是存放在[x][y]位置的。使用一對有意義的行和列的名稱作為索引可以使用你很容易找到所需的資料。
然後,我們卻不能使用一個簡單的for迴圈按順序遍歷每一列。可以使用for迴圈遍歷外部的數字索引陣列$products。$products陣列的每一行都是一個具有描述性索引的陣列。在while迴圈中使用each()和list()函式,可以遍歷整個內部陣列。因此,需要一個內嵌有while迴圈的for迴圈。
for ( $row = 0; $row < 3; $row++ }
{
while ( list ( $key, $value ) = each ( $products[$row] ) )
{
echo "|$value";
}
echo '|<br />';
}
三維陣列具有高、寬、深的概念。如果能輕鬆地將一個二維陣列想像成一個有行和列的表格,那麼就可以將三維陣列想像成一堆像這樣的表格。每個元素可以通過層、行和列進行引用。
根據建立多維陣列的方法,可以建立四維、五維或六維陣列。在PHP中,並沒有設定陣列維數的限制,但人們很難設想一個多於三維的陣列。大多數的實際問題在邏輯上只需要使用三維或者更少維的陣列結構就可以了。

3.7 多維陣列的排序
對多於一維的陣列進行排序,或者不按字母和數字的順序進行排,要複雜得多。PHP知道如何比較兩個數字或字串,但在多維陣列中,每個元素都是一個數組。PHP不知道如何比較兩個陣列,所以需要建立一個比較它們的方法。在大多數情況下,單詞和數字的順序是顯而易見的——但對於複雜的物件,問題就會多一些。

3.7.1 使用者定義排序
usort()中的“u”代表“user”,因為這個函式要求傳入使用者定義的比較函式。asort和ksort對應的版本uasort()和uksort()也要求傳入使用者定義的比較函式。
類似於asort(),當對非數字索引陣列的值進行排序時,uasort()才會被使用。如果值是簡單的數字或文字則可以使用asort。如果要比較的值像陣列一樣複雜,可以定義一個比較函式,然後使用uasort()。
類似於ksort(),當對非數字索引陣列的關鍵字進行排序時才使用uksort()。如果值是簡單的數字或文字就使用ksort。如果要比較的物件像陣列一樣複雜,可以定義一個比較函式,然後使用uksort()。

3.7.2 反向使用者排序
函式sort()、asort()和ksort()都分別對應一個帶字母“r”的反向排序函式。使用者定義的排序沒有反向變體,但可以對一個多維陣列進行反向排序。

3.8 對陣列進行重新排序

3.8.1 使用shuffle()函式
在PHP的早期版本中,shuffle()要求呼叫srand()函式時首先提供一個隨機數生成器。如今,這個步驟已經不再需要了。
如果這個函式對你非常重要,可以在程式中應用該函式之前在伺服器上測試它。
由於並不需要真正重新排序整個陣列,使用array_rand()函式可以實現相同的功能。

3.8.2 使用array_reverse()函式
array_reverse()函式使用一個數組作引數,返回一個內容與引數陣列相同但順序相反的陣列。
因為單獨使用range()函式將建立一個升序序列,所以必須使用sort()函式或array_reverse()函式將陣列中的數字變為降序。或者,也可以使用for迴圈通過一次一個元素的方式建立這個陣列。如:
$numbers = array();
for ($i=10; $i>0; $i--)
array_push( $numbers, $i );
一個for迴圈可以像這樣按降序方式執行。可以將計數器
一個for迴圈可以像這樣按降序方式執行。可以將計數器的初始值設為一個大數,在每次迴圈末尾使用運算子“--”將計數器減1。
在這裡,我們建立了一個空陣列,然後使用array_push()函式將每個新元素新增到陣列的末尾。請注意,和array_push()相反的函式是array_pop(),這個函式用來刪除並返回陣列末尾的一個元素。
或者,也可以使用array_reverse()函式將由range()函式所建立的陣列進行反向排序。
請注意,array_reverse()函式將返回一個原陣列修改後的副本。如果不再需要原來的陣列,比如在這個例子中,可以用新的副本覆蓋原來的版本。
如果資料只是一系列的整數,可以通過將-1作為range()函式的第三個可選調引數,以相反的順序建立該陣列。

3.9 從檔案載入陣列
使用file()函式將整個檔案載入一個數組中。檔案中的每行則成為陣列中的一個元素。使用了count()函式來統計陣列中的元素個數。
explode("/t", $orders[$i])
explode()函式可以將傳入的字串分割成一個個小塊。每個製表符成為兩個元素之間的斷點。這個函式的可選引數limit可以用來限制被返回的最大塊數。
可以使用許多方法從字串中提取數字。在這裡,我們使用了intval()函式。它可以將一個字串轉化成一個整數。這個轉換是相當智慧化的,它可以忽略某些部分,例如標籤就不能轉換成數字。

3.10 執行其他的陣列操作

3.10.1 在陣列中瀏覽:each()、current()、reset()、end()、next()、pos()和prev()
前面已經提到,每個陣列都有一個內部指標指向陣列中的當前元素。當使用函式each()時,就間接地使用了這個指標,但是也可以直接使用和操作這個指標。
如果建立一個新陣列,那麼當前指標就將被初始化,並指向陣列的第一個元素。
呼叫next()或each()將使指標前移一個元素。呼叫each($array_name)會在指標前移一個位置之前返回當前元素。next()函式則有些不同——呼叫next($array_name)是將指標前移,然後再返回新的當前元素。
呼叫end($array_name)可以將指標移到陣列末尾。
要反向遍歷一個數組,可以使用end()和prev()函式。prev()函式和next()函式相反。它是將當前指標往回移一個位置然後再返回新的當前元素。

3.10.2 對陣列的每一個元素應用任何函式:array_walk()
array_walk()函式需要三個引數。第一個是arr,也就是需要處理的陣列。第二個是func,也就是使用者自定義並將作用於陣列中每個元素的函式。第三個引數userdata是可選的,如果使用它,它可以作為一個引數傳遞給我們自己的函式。
看一個銷微複雜點的例子:
function my_multiply(&$value, $key, $factor)
{
$value *= $factor;
}
array_walk(&$array, 'my_multiply', 3);
在這裡,我們定義了一個名為my_multiply()的函式,它可以用所提供的乘法因子去乘以陣列中的每個元素。
此外,還有一個需要注意的問題是傳遞毿數$value的方式。在my_multiply()的函式定義中,變數前面的地址符(&)意味著$value是按引用方式傳遞的。按引用方式傳遞允許函式修改陣列的內容。

3.10.3 統計陣列元素個數:count()、sizeof()和array_count_values()
count()函式和sizeof()函式具有同樣的用途,都可以返回陣列元素的個數。可以得到一個常規標量變數中的元素個數,如果傳遞給這個函式的陣列是一個空陣列,或者是一個沒有經過設定的變數,返回的陣列個數就是0。
如果呼叫array_count_values($array),這個函式將會統計每個特定的值在陣列$array中出現過的次數(這就是陣列的基數集)。這個函式將返回一個包含頻率表的相關陣列。這個陣列包含陣列$array中的所有值,並以這些值作為相關陣列的關鍵字。每個關鍵字所對應的數值就是關鍵字在陣列$array中出現的次數。

3.10.4 將陣列轉換成標量變數:extract()
對於一個非數字索引陣列,而該陣列又有許多關鍵字-值對,可以使用函式extract()將它們轉換成一系列的標量變數。
函式extract()的作用是通過一個數組建立一系列的標量變數,這些變數的名稱必須是陣列中關鍵字的名稱,而變數值則是陣列中的值。
extract()函式具有兩個可選引數:extract_type和prefix。變數extract_type將告訴extract()函式如何處理衝突。有時可能已經存在一個和陣列關鍵字同名的變數,該函式的預設操作是覆蓋已有的變數。
兩個最常用的選項是EXTR_OVERWRITE(預設值)和EXTR_PREFIX_ALL。當知道會發生特定的衝突並且希望跳過該關鍵字或要給它加上字首時,可能會用到其他選項。
extract()可以提取出一個元素,該元素的關鍵字必須是一個有效的變數名稱,這就意味著以數字開始或包含空格的關鍵字將被跳過。