摘要:所以作為源數組,你可以將數組的值以引用傳遞方法傳入回調函數,數組的鍵名直接傳入就好了數組連接操作在中合并數組的最佳方式是使用函數。為了實現從數組中刪除不在其他數組中的值譯注計算差值,使用。
本文首發于 PHP 數組使用之道,轉載請注明出處。
這個教程我將通過一些實用的實例和最佳實踐的方式列舉出 PHP 中常用的數組函數。每個 PHP 工程師都應該掌握它們的使用方法,以及如何通過組合使用來編寫更精簡且易讀的代碼。
另外,我們提供了相關示例代碼的演示文稿,你可以從相關鏈接下載它,并分享給你的團隊來打造更強的團隊。
入門先讓我們從一些處理數組鍵名和鍵值的基礎數組函數開始。array_combine() 作為數組函數中的一員,用于通過使用一個數組的值作為其鍵名,另一個數組的值作為其值來創建一個全新數組:
blue // [grass] => green // [orange] => orange // )
你應該知道,array_values() 函數會以索引數組形式返回數組中的值,array_keys() 則會返回給定數組的鍵名, 以及 array_flip() 函數,它的功能則是交換數組中的鍵值和鍵名:
sky // [green] => grass // [orange] => orange // )簡化代碼
list() 函數,確切的說它不是一個函數,而是一種語言結構,可以在單次操作中將數組中的值賦值給一組變量。舉個例子,下面給出 list() 函數的基本使用:
這個語言結構結合 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() 函數,你可以將關聯數組導出到變量(符號表)中。對數組中的各個元素,將會以其鍵名作為變量名創建,變量的值則為對應元素的值:
"t-shirt", "size" => "medium", "color" => "blue", ]; extract($array); echo $clothes, " ", $size, " ", $color;注意在處理用戶數據(如請求的數據)時 extract() 函數是一個安全的函數,所以此時最好使用更好的 標志類型 如 EXTR_IF_EXISTS 和 EXTR_PREFIX_ALL。
extract() 函數的逆操作是 compact() 函數,用于通過變量名創建關聯數組:
t-shirt // [size] => medium // [color] => blue // )過濾函數PHP 提供一個用于過濾數組的超贊的函數,它是 array_filter()。將待處理數組作為函數的第一個參數,第二個參數是一個匿名函數。如果你希望數組中的元素通過驗證則在匿名函數返回 true,否則返回 false:
0; }); print_r($positive);// [0 => 20, 2 => 50, 4 => 55]函數不僅支持通過值過濾。你還可以使用 ARRAY_FILTER_USE_KEY 或 ARRAY_FILTER_USE_BOTH 作為第三參數指定是否將數組的鍵值或將鍵值和鍵名同時作為回調函數的參數。
你還可以不在 array_filter() 函數中定義回調函數以刪除空值:
-1, 2 => 1]你可以使用 array_unique() 函數用于從數組中獲取唯一值元素。注意該函數會保留唯一元素在原數組中的鍵名:
1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 // )array_column() 函數可以從多維數組(multi-dimensional)中獲取指定列的值,如從 SQL 數據庫中獲取答案或者 CSV 文件導入數據。只需要傳入數組和指定的列名:
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 功能更加強大,因為它開始支持 包含對象的數組,所以在處理數組模型時變得更加容易:
all(); $cinema_ids = array_column($cinemas, "id"); // php7 forever!數組遍歷處理通過使用 array_map(),你可以對數組中的每個元素執行回調方法。你可以基于給定的數組傳入函數名稱或匿名函數來獲取一個新數組:
對于這個函數還有個謠言,無法同時將數組的鍵名和鍵值傳入到回調函數,但是我們現在要來打破它:
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() 不會創建新數組,而是直接修改原數組。所以作為源數組,你可以將數組的值以引用傳遞方法傳入回調函數,數組的鍵名直接傳入就好了:
"yellow", "apple" => "green", "orange" => "orange", ]; array_walk($fruits, function (&$value, $key) { $value = $key . " is " . $value; }); print_r($fruits);數組連接操作在 PHP 中合并數組的最佳方式是使用 array_merge() 函數。所有的數組選項會合并到一個數組中,具有相同鍵名的值會被最后一個值所覆蓋:
"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() 函數獲取所有數組都存在的值(譯注:獲取交集)。接下來的示例演示它們的使用方法:
1, 1 => 2] print_r($intersect); //交集 [2 => 3, 3 => 4]數組的數學運算使用 array_sum() 對數組元素進行求和運算,array_product 對數組元素執行乘積運算,或者使用 array_reduce() 處理自定義運算規則:
為了實現統計數組中值的出現次數,可以使用 array_count_values() 函數。它將返回一個新數組,新數組鍵名為待統計數組的值,新數組的值為待統計數組值的出現次數:
2 // [banana] => 1 // [tree] => 3 // )生成數組需要以給定值生成固定長度的數組,可以使用 array_fill() 函數:
根據范圍創建數組,如小時或字母,可以使用 range() 函數:
為了實現獲取數組中的部分元素 - 比如,獲取前三個元素 - 使用 array_slice() 函數:
排序數組首先謹記 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() 函數僅需一行代碼就可以完成空字符截取和去空值處理:
依據模型數組創建 id 和 title 數據字典,我們可以結合使用 array_combine() 和 array_column() 函數:
譯注:提供一個 可運行的版本。為了實現獲取出現頻率最高的數組元素,我們可以使用 array_count_values()、arsort() 和 array_slice() 這幾個函數:
還可以輕易的通過 array_sum() 和 array_map() 函數僅需數行就能完成計算訂單的價格:
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 開發者應該掌握的最基本的一些。
另外需要注意的是我們創建了這些函數的示例,所以你可以從相關小節下載和分享給你的團隊。
如果你有任何問題,不要猶豫直接在文章的評論表單發表出來就好了。
更多及相關鏈接php.net 數組函數手冊
php.net 匿名函數(閉包)手冊
給你的團隊下載我們的教程
原文Working With PHP Arrays in the Right Way
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28989.html
摘要:超過三個參數會導致參數之間的組合過多,你必須對每個單獨的參數測試大量不同的情況。拆分這些函數,可以讓代碼可重用性更高且更易測試。 函數參數不要超過兩個 限制函數的參數數量是非常重要的,因為它使你的函數更容易測試。超過三個參數會導致參數之間的組合過多,你必須對每個單獨的參數測試大量不同的情況。 沒有參數是最理想的情況,一個或兩個參數是可以接受的,三個以上則是應該避免的。這很重要的。如果你...
摘要:日期和時間使用類完成讀取設置比較和計算日期與時間。單元測試單元測試是從編寫開始,貫穿于整個開發周期的一種用于保證函數類和方法的行為與預期一致的編程方法。是應用的單元測試框架的業界標準,其他幾個可選框架是行為驅動開發行為驅動開發有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...
摘要:權限中心的依賴聲明聲明依賴關系檢查代碼規范聲明開發依賴命名空間檢查代碼規范,執行單元測試。單元測試持續交付一切都如此的完美,沒有測試,又如何可以證明這件事情的完美,又如何可以保障交付的質量。 序 權限管理是無線運營系統中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關系。 本文著重講解如何通過PHP來構建一個靈活、通用、安全的權限管理系統。 關于權限 首先我們來聊聊權限。 權...
摘要:將代碼寫的簡潔并且易讀易懂是每一位優秀的所應該具備的基本功。前幾天在上看到這個項目,感覺很有收獲,于是在這里記錄一下。 將代碼寫的簡潔并且易讀易懂是每一位優秀的coder所應該具備的基本功。 前幾天在github上看到clean-code-php這個項目,感覺很有收獲,于是在這里記錄一下。 使用有意義并且可讀的變量名稱 Bad: $ymdstr = $moment->format(y-...
摘要:統一的編碼規范編碼規范往簡單說其實就是三個方面換行空格變量命名放在里面,還有一些附加的地方,比如關鍵字大小寫,語法糖的使用與等的問題。這些都是規范代碼的重要手段。推廣給你的隊友團隊項目中,隊友的配合對整個代碼的規范起著決定性的作用。 1. 統一的編碼規范 編碼規范往簡單說其實就是三個方面: 換行 空格 變量命名 放在 PHP 里面,還有一些附加的地方,比如關鍵字大小寫,語法糖的使用...
閱讀 3012·2021-11-22 12:06
閱讀 599·2021-09-03 10:29
閱讀 6526·2021-09-02 09:52
閱讀 2013·2019-08-30 15:52
閱讀 3411·2019-08-29 16:39
閱讀 1190·2019-08-29 15:35
閱讀 2061·2019-08-29 15:17
閱讀 1416·2019-08-29 11:17