成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP 數(shù)組使用之道

lanffy / 2600人閱讀

摘要:所以作為源數(shù)組,你可以將數(shù)組的值以引用傳遞方法傳入回調(diào)函數(shù),數(shù)組的鍵名直接傳入就好了數(shù)組連接操作在中合并數(shù)組的最佳方式是使用函數(shù)。為了實(shí)現(xiàn)從數(shù)組中刪除不在其他數(shù)組中的值譯注計(jì)算差值,使用。

本文首發(fā)于 PHP 數(shù)組使用之道,轉(zhuǎn)載請(qǐng)注明出處。

這個(gè)教程我將通過一些實(shí)用的實(shí)例和最佳實(shí)踐的方式列舉出 PHP 中常用的數(shù)組函數(shù)。每個(gè) PHP 工程師都應(yīng)該掌握它們的使用方法,以及如何通過組合使用來編寫更精簡且易讀的代碼。

另外,我們提供了相關(guān)示例代碼的演示文稿,你可以從相關(guān)鏈接下載它,并分享給你的團(tuán)隊(duì)來打造更強(qiáng)的團(tuán)隊(duì)。

入門

先讓我們從一些處理數(shù)組鍵名和鍵值的基礎(chǔ)數(shù)組函數(shù)開始。array_combine() 作為數(shù)組函數(shù)中的一員,用于通過使用一個(gè)數(shù)組的值作為其鍵名,另一個(gè)數(shù)組的值作為其值來創(chuàng)建一個(gè)全新數(shù)組:

 blue
//     [grass] => green
//     [orange] => orange
// )

你應(yīng)該知道,array_values() 函數(shù)會(huì)以索引數(shù)組形式返回?cái)?shù)組中的值,array_keys() 則會(huì)返回給定數(shù)組的鍵名, 以及 array_flip() 函數(shù),它的功能則是交換數(shù)組中的鍵值和鍵名:

 sky
//     [green] => grass
//     [orange] => orange
// )
簡化代碼

list() 函數(shù),確切的說它不是一個(gè)函數(shù),而是一種語言結(jié)構(gòu),可以在單次操作中將數(shù)組中的值賦值給一組變量。舉個(gè)例子,下面給出 list() 函數(shù)的基本使用:


這個(gè)語言結(jié)構(gòu)結(jié)合 preg_split()explode() 這類函數(shù)使用效果更佳,如果你無需定義其中的某些值,可以直接跳過一些參數(shù)的賦值:

$string = "hello|wild|world";

list($hello, , $world) = explode("|", $string);
echo $hello, " ", $world;

另外,list() 還可用于 foreach 遍歷,這種用法更能發(fā)揮這個(gè)語言結(jié)構(gòu)的優(yōu)勢(shì):

$arrays = [[1, 2], [3, 4], [5, 6]];

foreach ($arrays as list($a, $b)) {
    $c = $a + $b;

    echo $c, ", ";
}
譯者注:list() 語言結(jié)構(gòu)僅適用于數(shù)字索引數(shù)組,并默認(rèn)索引從 0 開始,且無法用于關(guān)聯(lián)數(shù)組,查看 文檔。

而通過使用 extract() 函數(shù),你可以將關(guān)聯(lián)數(shù)組導(dǎo)出到變量(符號(hào)表)中。對(duì)數(shù)組中的各個(gè)元素,將會(huì)以其鍵名作為變量名創(chuàng)建,變量的值則為對(duì)應(yīng)元素的值:

 "t-shirt",
    "size" => "medium",
    "color" => "blue",
];

extract($array);

echo $clothes, " ", $size, " ", $color;

注意在處理用戶數(shù)據(jù)(如請(qǐng)求的數(shù)據(jù))時(shí) extract() 函數(shù)是一個(gè)安全的函數(shù),所以此時(shí)最好使用更好的 標(biāo)志類型 如 EXTR_IF_EXISTSEXTR_PREFIX_ALL。

extract() 函數(shù)的逆操作是 compact() 函數(shù),用于通過變量名創(chuàng)建關(guān)聯(lián)數(shù)組:

 t-shirt
//     [size] => medium
//     [color] => blue
// )
過濾函數(shù)

PHP 提供一個(gè)用于過濾數(shù)組的超贊的函數(shù),它是 array_filter()。將待處理數(shù)組作為函數(shù)的第一個(gè)參數(shù),第二個(gè)參數(shù)是一個(gè)匿名函數(shù)。如果你希望數(shù)組中的元素通過驗(yàn)證則在匿名函數(shù)返回 true,否則返回 false

 0;
});

print_r($positive);// [0 => 20, 2 => 50, 4 => 55]

函數(shù)不僅支持通過值過濾。你還可以使用 ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH 作為第三參數(shù)指定是否將數(shù)組的鍵值或?qū)㈡I值和鍵名同時(shí)作為回調(diào)函數(shù)的參數(shù)。

你還可以不在 array_filter() 函數(shù)中定義回調(diào)函數(shù)以刪除空值:

 -1, 2 => 1]

你可以使用 array_unique() 函數(shù)用于從數(shù)組中獲取唯一值元素。注意該函數(shù)會(huì)保留唯一元素在原數(shù)組中的鍵名:

 1
//     [4] => 2
//     [7] => 3
//     [8] => 4
//     [9] => 5
// )

array_column() 函數(shù)可以從多維數(shù)組(multi-dimensional)中獲取指定列的值,如從 SQL 數(shù)據(jù)庫中獲取答案或者 CSV 文件導(dǎo)入數(shù)據(jù)。只需要傳入數(shù)組和指定的列名:

 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 功能更加強(qiáng)大,因?yàn)樗_始支持 包含對(duì)象的數(shù)組,所以在處理數(shù)組模型時(shí)變得更加容易:

all();
$cinema_ids = array_column($cinemas, "id"); // php7 forever!
數(shù)組遍歷處理

通過使用 array_map(),你可以對(duì)數(shù)組中的每個(gè)元素執(zhí)行回調(diào)方法。你可以基于給定的數(shù)組傳入函數(shù)名稱或匿名函數(shù)來獲取一個(gè)新數(shù)組:


對(duì)于這個(gè)函數(shù)還有個(gè)謠言,無法同時(shí)將數(shù)組的鍵名和鍵值傳入到回調(diào)函數(shù),但是我們現(xiàn)在要來打破它:

 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
// )

不過這樣處理起來實(shí)在是丑陋。最好使用 array_walk() 函數(shù)來替代。這個(gè)函數(shù)表現(xiàn)上和 array_map() 類似,但是工作原理完全不同。第一,數(shù)組是以引用傳值方式傳入,所以 array_walk() 不會(huì)創(chuàng)建新數(shù)組,而是直接修改原數(shù)組。所以作為源數(shù)組,你可以將數(shù)組的值以引用傳遞方法傳入回調(diào)函數(shù),數(shù)組的鍵名直接傳入就好了:

 "yellow",
    "apple" => "green",
    "orange" => "orange",
];

array_walk($fruits, function (&$value, $key) {
    $value = $key . " is " . $value;
});

print_r($fruits);
數(shù)組連接操作

在 PHP 中合并數(shù)組的最佳方式是使用 array_merge() 函數(shù)。所有的數(shù)組選項(xiàng)會(huì)合并到一個(gè)數(shù)組中,具有相同鍵名的值會(huì)被最后一個(gè)值所覆蓋:

 "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
// )
譯注:有關(guān)合并數(shù)組操作還有一個(gè)「+」號(hào)運(yùn)算符,它和 array_merge() 函數(shù)的功能類似都可以完成合并數(shù)組運(yùn)算,但是結(jié)果有所不同,可以查看 PHP 合并數(shù)組運(yùn)算符 + 與 array_merge 函數(shù) 了解更多細(xì)節(jié)。

為了實(shí)現(xiàn)從數(shù)組中刪除不在其他數(shù)組中的值(譯注:計(jì)算差值),使用 array_diff()。還可以通過 array_intersect() 函數(shù)獲取所有數(shù)組都存在的值(譯注:獲取交集)。接下來的示例演示它們的使用方法:

 1, 1 => 2]
print_r($intersect); //交集 [2 => 3, 3 => 4]
數(shù)組的數(shù)學(xué)運(yùn)算

使用 array_sum() 對(duì)數(shù)組元素進(jìn)行求和運(yùn)算,array_product 對(duì)數(shù)組元素執(zhí)行乘積運(yùn)算,或者使用 array_reduce() 處理自定義運(yùn)算規(guī)則:


為了實(shí)現(xiàn)統(tǒng)計(jì)數(shù)組中值的出現(xiàn)次數(shù),可以使用 array_count_values() 函數(shù)。它將返回一個(gè)新數(shù)組,新數(shù)組鍵名為待統(tǒng)計(jì)數(shù)組的值,新數(shù)組的值為待統(tǒng)計(jì)數(shù)組值的出現(xiàn)次數(shù):

 2
//     [banana] => 1
//     [tree] => 3
// )
生成數(shù)組

需要以給定值生成固定長度的數(shù)組,可以使用 array_fill() 函數(shù):


根據(jù)范圍創(chuàng)建數(shù)組,如小時(shí)或字母,可以使用 range() 函數(shù):


為了實(shí)現(xiàn)獲取數(shù)組中的部分元素 - 比如,獲取前三個(gè)元素 - 使用 array_slice() 函數(shù):


排序數(shù)組

首先謹(jǐn)記 PHP 中有關(guān)排序的函數(shù)都是 引用傳值 的,排序成功返回 true 排序失敗返回 false。排序的基礎(chǔ)函數(shù)是 sort() 函數(shù),它執(zhí)行排序后的結(jié)果不會(huì)保留原索引順序。排序函數(shù)可以歸類為以下幾類:

a 保持索引關(guān)系進(jìn)行排序

k 依據(jù)鍵名排序

r 對(duì)數(shù)組進(jìn)行逆向排序

u 使用用戶自定義排序規(guī)則排序

你可以從下表看到這些排序函數(shù):

a k r u
a asort arsort uasort
k ksort krsort
r arsort krsort rsort
u uasort usort
數(shù)組函數(shù)的組合使用

數(shù)組處理的藝術(shù)是組合使用這些數(shù)組函數(shù)。這里我們通過 array_filter()array_map() 函數(shù)僅需一行代碼就可以完成空字符截取和去空值處理:


依據(jù)模型數(shù)組創(chuàng)建 id 和 title 數(shù)據(jù)字典,我們可以結(jié)合使用 array_combine()array_column() 函數(shù):


譯注:提供一個(gè) 可運(yùn)行的版本。

為了實(shí)現(xiàn)獲取出現(xiàn)頻率最高的數(shù)組元素,我們可以使用 array_count_values()arsort()array_slice() 這幾個(gè)函數(shù):


還可以輕易的通過 array_sum()array_map() 函數(shù)僅需數(shù)行就能完成計(jì)算訂單的價(jià)格:

 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
總結(jié)

正如你所看到的那樣,掌握主要的數(shù)組函數(shù)可以是我們的代碼更精簡且易于閱讀。當(dāng)然,PHP 提供了比列出來的要多得多的數(shù)組函數(shù),并且還提供了額外參數(shù)及標(biāo)識(shí)參數(shù),但是我覺得本教程中已經(jīng)涵蓋了 PHP 開發(fā)者應(yīng)該掌握的最基本的一些。

另外需要注意的是我們創(chuàng)建了這些函數(shù)的示例,所以你可以從相關(guān)小節(jié)下載和分享給你的團(tuán)隊(duì)。

如果你有任何問題,不要猶豫直接在文章的評(píng)論表單發(fā)表出來就好了。

更多及相關(guān)鏈接

php.net 數(shù)組函數(shù)手冊(cè)

php.net 匿名函數(shù)(閉包)手冊(cè)

給你的團(tuán)隊(duì)下載我們的教程

原文

Working With PHP Arrays in the Right Way

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28989.html

相關(guān)文章

  • PHP代碼簡潔之道——函數(shù)部分

    摘要:超過三個(gè)參數(shù)會(huì)導(dǎo)致參數(shù)之間的組合過多,你必須對(duì)每個(gè)單獨(dú)的參數(shù)測(cè)試大量不同的情況。拆分這些函數(shù),可以讓代碼可重用性更高且更易測(cè)試。 函數(shù)參數(shù)不要超過兩個(gè) 限制函數(shù)的參數(shù)數(shù)量是非常重要的,因?yàn)樗鼓愕暮瘮?shù)更容易測(cè)試。超過三個(gè)參數(shù)會(huì)導(dǎo)致參數(shù)之間的組合過多,你必須對(duì)每個(gè)單獨(dú)的參數(shù)測(cè)試大量不同的情況。 沒有參數(shù)是最理想的情況,一個(gè)或兩個(gè)參數(shù)是可以接受的,三個(gè)以上則是應(yīng)該避免的。這很重要的。如果你...

    crossoverJie 評(píng)論0 收藏0
  • php之道》讀后總結(jié) php學(xué)習(xí)綱要

    摘要:日期和時(shí)間使用類完成讀取設(shè)置比較和計(jì)算日期與時(shí)間。單元測(cè)試單元測(cè)試是從編寫開始,貫穿于整個(gè)開發(fā)周期的一種用于保證函數(shù)類和方法的行為與預(yù)期一致的編程方法。是應(yīng)用的單元測(cè)試框架的業(yè)界標(biāo)準(zhǔn),其他幾個(gè)可選框架是行為驅(qū)動(dòng)開發(fā)行為驅(qū)動(dòng)開發(fā)有兩種方式和。 《php之道》閱讀地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...

    gitmilk 評(píng)論0 收藏0
  • 途牛原創(chuàng)|大話權(quán)限中心的PHP架構(gòu)之道

    摘要:權(quán)限中心的依賴聲明聲明依賴關(guān)系檢查代碼規(guī)范聲明開發(fā)依賴命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無線運(yùn)營系統(tǒng)中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關(guān)系。 本文著重講解如何通過PHP來構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來聊聊權(quán)限。 權(quán)...

    miracledan 評(píng)論0 收藏0
  • PHP代碼簡潔之道——變量部分

    摘要:將代碼寫的簡潔并且易讀易懂是每一位優(yōu)秀的所應(yīng)該具備的基本功。前幾天在上看到這個(gè)項(xiàng)目,感覺很有收獲,于是在這里記錄一下。 將代碼寫的簡潔并且易讀易懂是每一位優(yōu)秀的coder所應(yīng)該具備的基本功。 前幾天在github上看到clean-code-php這個(gè)項(xiàng)目,感覺很有收獲,于是在這里記錄一下。 使用有意義并且可讀的變量名稱 Bad: $ymdstr = $moment->format(y-...

    mgckid 評(píng)論0 收藏0
  • PHP 代碼規(guī)范簡潔之道

    摘要:統(tǒng)一的編碼規(guī)范編碼規(guī)范往簡單說其實(shí)就是三個(gè)方面換行空格變量命名放在里面,還有一些附加的地方,比如關(guān)鍵字大小寫,語法糖的使用與等的問題。這些都是規(guī)范代碼的重要手段。推廣給你的隊(duì)友團(tuán)隊(duì)項(xiàng)目中,隊(duì)友的配合對(duì)整個(gè)代碼的規(guī)范起著決定性的作用。 1. 統(tǒng)一的編碼規(guī)范 編碼規(guī)范往簡單說其實(shí)就是三個(gè)方面: 換行 空格 變量命名 放在 PHP 里面,還有一些附加的地方,比如關(guān)鍵字大小寫,語法糖的使用...

    BearyChat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<