這篇文章主要介紹了關於PHP數組的使用方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
這個教程我將通過一些實用的執行個體和最佳實務的方式列舉出 PHP 中常用的數組函數。每個 PHP 工程師都應該掌握它們的使用方法,以及如何通過組合使用來編寫更精簡且易讀的代碼。
另外,我們提供了相關範例程式碼的簡報,你可以從相關連結下載它,並分享給你的團隊來打造更強的團隊。
入門
先讓我們從一些處理數組鍵名和索引值的基礎數組函數開始。array_combine() 作為數組函數中的一員,用於通過使用一個數組的值作為其鍵名,另一個數組的值作為其值來建立一個全新數組:
<?php$keys = ['sky', 'grass', 'orange'];$values = ['blue', 'green', 'orange'];$array = array_combine($keys, $values);print_r($array);// Array// (// [sky] => blue// [grass] => green// [orange] => orange// )
你應該知道,array_values() 函數會以索引數組形式返回數組中的值,array_keys() 則會返回給定數組的鍵名, 以及 array_flip() 函數,它的功能則是交換數組中的索引值和鍵名:
<?phpprint_r(array_keys($array));// ['sky', 'grass', 'orange']print_r(array_values($array));// ['blue', 'green', 'orange']print_r(array_flip($array));// Array// (// [blue] => sky// [green] => grass// [orange] => orange// )
簡化代碼
list() 函數,確切的說它不是一個函數,而是一種語言結構,可以在單次操作中將數組中的值賦值給一組變數。舉個例子,下面給出 list() 函數的基本使用:
<?php// 定義數組$array = ['a', 'b', 'c'];// 不使用 list()$a = $array[0];$b = $array[1];$c = $array[2];// 使用 list() 函數list($a, $b, $c) = $array;
這個語言結構結合 preg_split() 或 explode() 這類函數使用效果更佳,如果你無需定義其中的某些值,可以直接跳過一些參數的賦值:
$string = 'hello|wild|world';list($hello, , $world) = explode('|', $string);echo $hello, ' ', $world;
另外,list() 還可用於 foreach 遍曆,這種用法更能發揮這個語言結構的優勢:
$arrays = [[1, 2], [3, 4], [5, 6]];foreach ($arrays as list($a, $b)) { $c = $a + $b; echo $c, ', ';}
譯者註:list() 語言結構僅適用於數字索引數組,並預設索引從
0 開始,且無法用於關聯陣列,查看 文檔。
而通過使用 extract() 函數,你可以將關聯陣列匯出到變數(符號表)中。對數組中的各個元素,將會以其鍵名作為變數名建立,變數的值則為對應元素的值:
<?php$array = [ 'clothes' => 't-shirt', 'size' => 'medium', 'color' => 'blue',];extract($array);echo $clothes, ' ', $size, ' ', $color;
注意在處理使用者資料(如請求的資料)時 extract() 函數是一個安全的函數,所以此時最好使用更好的 標誌類型 如 EXTR_IF_EXISTS 和 EXTR_PREFIX_ALL。
extract() 函數的逆操作是 compact() 函數,用於通過變數名建立關聯陣列:
<?php$clothes = 't-shirt';$size = 'medium';$color = 'blue';$array = compact('clothes', 'size', 'color');print_r($array);// Array// (// [clothes] => t-shirt// [size] => medium// [color] => blue// )
過濾函數
PHP 提供一個用於過濾數組的超贊的函數,它是 array_filter()。將待處理數組作為函數的第一個參數,第二個參數是一個匿名函數。如果你希望數組中的元素通過驗證則在匿名函數返回 true,否則返回 false:
<?php$numbers = [20, -3, 50, -99, 55];$positive = array_filter($numbers, function ($number) { return $number > 0;});print_r($positive);// [0 => 20, 2 => 50, 4 => 55]
函數不僅支援通過值過濾。你還可以使用 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH 作為第三參數指定是否將數組的索引值或將索引值和鍵名同時作為回呼函數的參數。
你還可以不在 array_filter() 函數中定義回呼函數以刪除空值:
<?php$numbers = [-1, 0, 1];$not_empty = array_filter($numbers);print_r($not_empty);// [0 => -1, 2 => 1]
你可以使用 array_unique() 函數用於從數組中擷取唯一值元素。注意該函數會保留唯一元素在原數組中的鍵名:
<?php$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5];$uniques = array_unique($array);print_r($uniques);print_r($array);// Array// (// [0] => 1// [4] => 2// [7] => 3// [8] => 4// [9] => 5// )
array_column() 函數可以從多維陣列(multi-dimensional)中擷取指定列的值,如從 SQL 資料庫中擷取答案或者 CSV 檔案匯入資料。只需要傳入數組和指定的列名:
<?php$array = [ ['id' => 1, 'title' => 'tree'], ['id' => 2, 'title' => 'sun'], ['id' => 3, 'title' => 'cloud'],];$ids = array_column($array, 'id');print_r($ids);// [1, 2, 3]
從 PHP 7 開始,array_column 功能更加強大,因為它開始支援 包含對象的數組,所以在處理數組模型時變得更加容易:
<?php$cinemas = Cinema::find()->all();$cinema_ids = array_column($cinemas, 'id'); // php7 forever!
數組遍曆處理
通過使用 array_map(),你可以對數組中的每個元素執行回調方法。你可以基於給定的數組傳入函數名稱或匿名函數來擷取一個新數組:
<?php$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];$aliases = array_map('strtolower', $cities);print_r($aliases);// ['berlin', 'kyiv, 'amsterdam', 'riga']$numbers = [1, -2, 3, -4, 5];$squares = array_map(function ($number) { return $number ** 2;}, $numbers);print_r($squares);// [1, 4, 9, 16, 25]
對於這個函數還有個謠言,無法同時將數組的鍵名和索引值傳入到回呼函數,但是我們現在要來打破它:
<?php$model = ['id' => 7, 'name' => 'James'];$res = array_map(function ($key, $value) { return $key . ' is ' . $value;}, array_keys($model), $model);print_r($res);// Array// (// [0] => id is 7// [1] => name is James// )
不過這樣處理起來實在是醜陋。最好使用 array_walk() 函數來替代。這個函數表現上和 array_map() 類似,但是工作原理完全不同。第一,數組是以引用傳值方式傳入,所以 array_walk() 不會建立新數組,而是直接修改原數組。所以作為源數組,你可以將數組的值以引用傳遞方法傳入回呼函數,數組的鍵名直接傳入就好了:
<?php$fruits = [ 'banana' => 'yellow', 'apple' => 'green', 'orange' => 'orange',];array_walk($fruits, function (&$value, $key) { $value = $key . ' is ' . $value;});print_r($fruits);
數組串連操作
在 PHP 中合并數組的最佳方式是使用 array_merge() 函數。所有的數組選項會合并到一個數組中,具有相同鍵名的值會被最後一個值所覆蓋:
<?php$array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c'];$array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D']; $merge = array_merge($array1, $array2);print_r($merge);// Array// (// [a] => A// [b] => B// [c] => c// [D] => D// )
譯註:有關合并數組操作還有一個「+」號運算子,它和
array_merge() 函數的功能類似都可以完成合併數組運算,但是結果有所不同,可以查看 PHP 合并數組運算子 + 與 array_merge 函數 瞭解更多細節。
為了實現從數組中刪除不在其他數組中的值(譯註:計算差值),使用 array_diff()。還可以通過 array_intersect() 函數擷取所有數組都存在的值(譯註:擷取交集)。接下來的樣本示範它們的使用方法:
<?php$array1 = [1, 2, 3, 4];$array2 = [3, 4, 5, 6];$diff = array_diff($array1, $array2);$intersect = array_intersect($array1, $array2);print_r($diff); // 差集 [0 => 1, 1 => 2]print_r($intersect); //交集 [2 => 3, 3 => 4]
數組的數學運算
使用 array_sum() 對數組元素進行求和運算,array_product 對數組元素執行乘積運算,或者使用 array_reduce() 處理自訂運算規則:
<?php$numbers = [1, 2, 3, 4, 5];print_r(array_sum($numbers));// 15print_r(array_product($numbers));// 120print_r(array_reduce($numbers, function ($carry, $item) { return $$carry ? $carry / $item : 1;}));// 0.0083 = 1/2/3/4/5
為了實現統計數組中值的出現次數,可以使用 array_count_values() 函數。它將返回一個新數組,新數組鍵名為待統計數組的值,新數組的值為待統計數組值的出現次數:
<?php$things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree'];$values = array_count_values($things);print_r($values);// Array// (// [apple] => 2// [banana] => 1// [tree] => 3// )
產生數組
需要以給定值產生固定長度的數組,可以使用 array_fill() 函數:
<?php$bind = array_fill(0, 5, '?');print_r($bind);
根據範圍建立數組,如小時或字母,可以使用 range() 函數:
<?php$letters = range('a', 'z');print_r($letters); // ['a', 'b', ..., 'z']$hours = range(0, 23);print_r($hours); // [0, 1, 2, ..., 23]
為了實現擷取數組中的部分元素 - 比如,擷取前三個元素 - 使用 array_slice() 函數:
<?php$numbers = range(1, 10);$top = array_slice($numbers, 0, 3);print_r($top);// [1, 2, 3]
排序數組
首先謹記 PHP 中有關排序的函數都是 引用傳值 的,排序成功返回 true 排序失敗返回 false。排序的基礎函數是 sort() 函數,它執行排序後的結果不會保留原索引順序。排序函數可以歸類為以下幾類:
a 保持索引關係進行排序
k 依據鍵名排序
r 對數組進行逆向排序
u 使用使用者自訂定序排序
你可以從下表看到這些排序函數:
|
a |
k |
r |
u |
a |
asort |
|
arsort |
uasort |
k |
|
ksort |
krsort |
|
r |
arsort |
krsort |
rsort |
|
u |
uasort |
|
|
usort |
數組函數的組合使用
數組處理的藝術是組合使用這些數組函數。這裡我們通過 array_filter() 和 array_map() 函數僅需一行代碼就可以完成Null 字元截取和去控制處理:
<?php$values = ['say', ' bye', '', ' to', ' spaces ', ' '];$words = array_filter(array_map('trim', $values));print_r($words);// ['say', 'bye', 'to', 'spaces']
依據模型數組建立 id 和 title 資料字典,我們可以結合使用 array_combine() 和 array_column() 函數:
<?php$models = [$model, $model, $model];$id_to_title = array_combine( array_column($models, 'id'), array_column($models, 'title'));print_r($id_to_title);
譯註:提供一個 可啟動並執行版本。
為了實現擷取出現頻率最高的數組元素,我們可以使用 array_count_values()、arsort() 和 array_slice() 這幾個函數:
<?php$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd'];$values = array_count_values($letters);arsort($values);$top = array_slice($values, 0, 3);print_r($top);
還可以輕易的通過 array_sum() 和 array_map() 函數僅需數行就能完成計算訂單的價格:
<?php$order = [ ['product_id' => 1, 'price' => 99, 'count' => 1], ['product_id' => 2, 'price' => 50, 'count' => 2], ['product_id' => 2, 'price' => 17, 'count' => 3],];$sum = array_sum(array_map(function ($product_row) { return $product_row['price'] * $product_row['count'];}, $order));print_r($sum);// 250
總結
正如你所看到的那樣,掌握主要的數組函數可以是我們的代碼更精簡且易於閱讀。當然,PHP 提供了比列出來的要多得多的數組函數,並且還提供了額外參數及標識參數,但是我覺得本教程中已經涵蓋了 PHP 開發人員應該掌握的最基本的一些。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!