如下所示的程式碼將使用each()結構列印$prices數組的內容:
" ;
"; 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迴圈來達到相同的效果:
如果對一個大數組使用這種程式碼,那麼將簡潔得多。 你可能更喜歡創建列名稱來代替數字。可以使用如下程式碼:
如果希望檢索單一值,那麼使用這個陣列會容易得多。 ,將所描述的內容保存到用它的名稱命名的列中,與將其保存到所謂的第一列中相比,前者更容易記憶。在[x][y]位置的。 然後,我們卻不能使用一個簡單的for迴圈來按順序遍歷每一列。可以使用for迴圈遍歷外部的數 字索引數組$products。 $products數組的每一行都是一個具有描述性索引的陣列。在while迴圈中使用each()和list()函數, 可以遍歷整個內部陣列。因此,需要一個內嵌有while迴圈的for迴圈。
三維數組具有高、寬、深的概念。如果能輕鬆地將一個二維數組想像成一個有行和列的表格,那麼就可以將三維數組想像成一堆像這樣的表格。每個元素可以透過圖層、行和列進行引用。 根據建立多維數組的方法,可以建立四維、五維或六維數組。在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迴圈透過一次一個元素的方式來建立這個陣列。如:
一個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是可選的,如果使用它,它可以作為一個參數傳遞給我們自己的函數。 看一個銷微複雜點的例子:
在這裡,我們定義了一個名為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()可以提取出一個元素,該元素的關鍵字必須是一個有效的變數名稱,這意味著以數字開始或包含空格的關鍵字將被跳過。 |