這篇文章主要介紹了關於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() 函數,它的函數則是交換數組中的鍵值和鍵名:
<?php print_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));// 15 print_r(array_product($numbers));// 120 print_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() 函数仅需一行代码就可以完成空字符截取和去控制处理:
<?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 开发者应该掌握的最基本的一些。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上是PHP數組的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!