国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

巧用 PHP 數(shù)組函數(shù)

habren / 1378人閱讀

摘要:但是我發(fā)現(xiàn)好像很多小伙伴都忽略了內(nèi)置函數(shù)的作用比如我自己就編寫過一些有關(guān)數(shù)組操作的代碼然后發(fā)現(xiàn)自帶了,善用內(nèi)置函數(shù)能極大的提高開發(fā)效率和運(yùn)行效率內(nèi)置函數(shù)都是用寫的效率比用寫的高很多,所以本文便總結(jié)了一些在常見場景中利用內(nèi)置函數(shù)的實(shí)現(xiàn)方法。

0x00 前言

PHP 的數(shù)組是一種很強(qiáng)大的數(shù)據(jù)類型,與此同時(shí) PHP 內(nèi)置了一系列與數(shù)組相關(guān)的函數(shù)可以很輕易的實(shí)現(xiàn)日常開發(fā)的功能。但是我發(fā)現(xiàn)好像很多小伙伴都忽略了內(nèi)置函數(shù)的作用(比如我自己就編寫過一些有關(guān)數(shù)組操作的代碼然后發(fā)現(xiàn)PHP自帶了/(ㄒoㄒ)/~~),善用 PHP 內(nèi)置函數(shù)能極大的提高開發(fā)效率和運(yùn)行效率(內(nèi)置函數(shù)都是用 C 寫的效率比用 PHP 寫的高很多),所以本文便總結(jié)了一些在常見場景中利用 PHP 內(nèi)置函數(shù)的實(shí)現(xiàn)方法。此外如果想更深入的學(xué)習(xí)有關(guān) PHP 數(shù)組函數(shù)最好還是去查 PHP 手冊(cè)!點(diǎn)我看官方數(shù)組函數(shù)手冊(cè)

0x01 取指定鍵名

對(duì)于某些關(guān)聯(lián)數(shù)組,有時(shí)候我們只想取指定鍵名的那部分,比如數(shù)組為 ["id" => 1, "name" => "zane", "password" => "123456"] 此時(shí)若只想取包含 id 和 name 的部分該怎么實(shí)現(xiàn)呢?下面直接貼代碼。

 1, "name" => "zane", "password" => "123456"];
// 自己用 PHP 實(shí)現(xiàn)
function onlyKeys($raw, $keys) {
    $new = [];
    foreach ($raw as $key => $val) {
        if (in_array($key, $keys)) {
            $new[$key] = $val;
        }
    }
    
    return $new;
}
// 用 PHP 內(nèi)置函數(shù)實(shí)現(xiàn)
function newOnlyKeys($array, $keys) {
    return array_intersect_key($array, array_flip($keys));
}
var_dump(onlyKeys($raw, ["id", "name"]));
// 結(jié)果 ["id" => 1, "name" => "zane"]
var_dump(newOnlyKeys($raw, ["id", "name"]));
// 結(jié)果 ["id" => 1, "name" => "zane"]

很明顯簡潔很多有木有!不過 array_intersect_keyarray_flip 是什么鬼?這里簡單的介紹一下這兩個(gè)函數(shù)的作用,首先是 array_flip 函數(shù),這個(gè)函數(shù)的功能是「將數(shù)組的鍵和值對(duì)調(diào)」,也就是鍵名變成值,值變成鍵名。我們傳遞的 $keys 參數(shù)經(jīng)過這個(gè)函數(shù)便從 [0 => "id", 1 => "name"] 轉(zhuǎn)變?yōu)榱?["id" => 0, "name" => 1]。這樣做的目的是為了向 array_intersect_key 函數(shù)服務(wù),array_intersect_key 函數(shù)的功能是「使用鍵名比較計(jì)算數(shù)組的交集」,也就是返回第一個(gè)參數(shù)數(shù)組中與其他參數(shù)數(shù)組相同鍵名的值。這樣便實(shí)現(xiàn)了取指定鍵名的功能 ~(≧▽≦)/~啦!當(dāng)然要詳細(xì)了解這兩個(gè)函數(shù)的功能還是要查 PHP 官方手冊(cè):array_flip array_intersect_key

0x02 移除指定鍵名

有了上一個(gè)例子做鋪墊,這個(gè)就簡單講講啦,道理是大同小異滴。

 1, "name" => "zane", "password" => "123456"];
// 用 PHP 內(nèi)置函數(shù)實(shí)現(xiàn)
function removeKeys($array, $keys) {
    return array_diff_key($array, array_flip($keys));
}
// 移除 id 鍵
var_dump(removeKeys($raw, ["id", "password"]));
// 結(jié)果 ["name" => "zane"]

和上一個(gè)例子相比本例只是將 array_intersect_key 函數(shù)改為 array_diff_key,嗯……相信大家能猜出來這個(gè)函數(shù)的功能「使用鍵名比較計(jì)算數(shù)組的差集」,剛好和 array_intersect_key 的功能相反而已。官方手冊(cè):array_diff_key

0x03 數(shù)組去重

這個(gè)相信大家都有這個(gè)需求,當(dāng)然 PHP 也內(nèi)置了 array_unique 函數(shù)供給大家使用,如下例:

 666, "i am" => 233, "he is" => 233, "she is" => 666];
$result = array_unique($input);
var_dump($result);
// 結(jié)果 ["you are" => 666, "i am" => 233]

嘿,用這個(gè)函數(shù)就能解決大部分問題了,但是有時(shí)候你可能會(huì)覺得它不夠快,原因如下:

array_unique() 先將值作為字符串排序,然后對(duì)每個(gè)值只保留第一個(gè)遇到的鍵名,接著忽略所有后面的鍵名。

因?yàn)檫@個(gè)函數(shù)會(huì)先將數(shù)組進(jìn)行排序,所以速度可能在某些場景達(dá)不到預(yù)期的要求。

現(xiàn)在我們可以祭出我們的黑科技 array_flip 函數(shù),眾所周知 PHP 里數(shù)組的鍵名是唯一的,所以在鍵名和值對(duì)調(diào)后重復(fù)的值便被忽略了。試想一下我們連續(xù)調(diào)用兩次 array_flip 函數(shù)是不是就相當(dāng)于實(shí)現(xiàn)了 array_unique 函數(shù)的功能呢?示例代碼如下:

 666, "i am" => 233, "he is" => 233, "she is" => 666];
$result = array_flip(array_flip($input));
var_dump($result);
// 結(jié)果 ["she is" => 666, "he is" => 233]

嗯哼?!結(jié)果和 array_unique 的不一樣!為什么,我們可以從 PHP 官方手冊(cè)得到答案:

如果同一個(gè)值出現(xiàn)多次,則最后一個(gè)鍵名將作為它的值,其它鍵會(huì)被丟棄。

總的來說就是 array_unique 保留第一個(gè)出現(xiàn)的鍵名,array_flip 保留最后一個(gè)出現(xiàn)的鍵名。

注意:使用 array_flip 作為數(shù)組去重時(shí)數(shù)組的值必須能夠作為鍵名(即為 string 類型或 integer 類型),否則這個(gè)值將被忽略。

此外,若不需要保留鍵名我們可以直接這樣使用 array_values(array_flip($input))

0x04 重置索引

當(dāng)我們想要對(duì)一個(gè)索引并不連續(xù)的數(shù)組進(jìn)行重置時(shí),比如數(shù)組:[0 => 233, 99 => 666],對(duì)于這種數(shù)組我們只需要調(diào)用 array_values 函數(shù)即可實(shí)現(xiàn)。如下例:

 233, 99 => 666];
var_dump(array_values($input));
// 結(jié)果 [0 => 233, 1 => 66]

需要注意的是 array_values 函數(shù)并不止重置數(shù)字索引還會(huì)將字符串鍵名也同樣刪除并重置。那如何在保留字符串鍵名的同時(shí)重置數(shù)字索引呢?答案就是 array_slice 函數(shù),代碼示例如下:

 "world", 0 => 233, 99 => 666];
var_dump(array_slice($input, 0));
// 結(jié)果 ["hello" => "world", 0 => 233, 1 => 66]

array_slice 函數(shù)的功能是取出數(shù)組的中的一段,但它默認(rèn)會(huì)重新排序并重置數(shù)組的數(shù)字索引,所以可以利用它重置數(shù)組中的數(shù)字索引。

0x05 清除空值

嘿,有時(shí)候我們想清除某個(gè)數(shù)組中的空值比如:nullfalse00.0[]空數(shù)組""空字符串"0"字符串0 ,這時(shí) array_filter 函數(shù)便能幫上大忙。代碼如下:

 "foo", 2 => -1]

為什么會(huì)出現(xiàn)這樣的結(jié)果捏?array_filter 的作用其實(shí)是「用回調(diào)函數(shù)過濾數(shù)組中的單元」,它的第二個(gè)參數(shù)其實(shí)是個(gè)回調(diào)函數(shù),向數(shù)組的每個(gè)成員都執(zhí)行這個(gè)回調(diào)函數(shù),若回調(diào)函數(shù)的返回值為 true 便保留這個(gè)成員,為 false 則忽略。這個(gè)函數(shù)還有一個(gè)特性就是:

如果沒有提供 callback 函數(shù), 將刪除 array 中所有等值為 FALSE 的條目。

等值為 false 就是轉(zhuǎn)換為 bool 類型后值為 false 的意思,詳細(xì)看文檔:轉(zhuǎn)換為布爾類型。

注意:如果不填寫 callback 函數(shù),00.0"0"字符串0 這些可能有意義的值會(huì)被刪除。所以如果清除的規(guī)則有所不同還需要自行編寫 callback 函數(shù)。

0x06 確認(rèn)數(shù)組成員全部為真

有時(shí)候我們希望確認(rèn)數(shù)組中的的值全部為 true,比如:["read" => true, "write" => true, "execute" => true],這時(shí)我們需要用一個(gè)循環(huán)判定嗎?NO,NO,NO……只需要用 array_product 函數(shù)便可以實(shí)現(xiàn)了。代碼如下:

 true, "write" => true, "execute" => true];
var_dump((bool)array_product($power));
// 結(jié)果 true
$power = ["read" => true, "write" => true, "execute" => false];
var_dump((bool)array_product($power));
// 結(jié)果 false

為什么能實(shí)現(xiàn)這個(gè)功能呢? array_product 函數(shù)本來的功能是「計(jì)算數(shù)組中所有值的乘積」,在累乘數(shù)組中所有成員的時(shí)候會(huì)將成員的值轉(zhuǎn)為數(shù)值類型。當(dāng)傳遞的參數(shù)為一個(gè) bool 成員所組成的數(shù)組時(shí),眾所周知 true 會(huì)被轉(zhuǎn)為 1,false 會(huì)被轉(zhuǎn)為 0。然后只要數(shù)組中出現(xiàn)一個(gè) false 累乘的結(jié)果自然會(huì)變成 0,然后我們?cè)賹⒔Y(jié)果轉(zhuǎn)為 bool 類型不就是 false 了嘛!

注意:使用 array_product 函數(shù)將在計(jì)算過程中將數(shù)組成員轉(zhuǎn)為數(shù)值類型進(jìn)行計(jì)算,所以請(qǐng)確保你了解數(shù)組成員轉(zhuǎn)為數(shù)值類型后的值,否則會(huì)產(chǎn)生意料之外的結(jié)果。比如:

 true, "write" => true, "execute" => "true"];
var_dump((bool)array_product($power));
// 結(jié)果 false

上例是因?yàn)?"true" 在計(jì)算過程中被轉(zhuǎn)為 0。要想詳細(xì)了解請(qǐng)點(diǎn)擊這里。

0x07 獲取指定鍵名之前 / 之后的數(shù)組

如果我們只想要關(guān)聯(lián)數(shù)組中指定鍵名值之前的部分該怎么辦呢?又用一個(gè)循環(huán)?當(dāng)然不用我們可以通過 array_keys、array_search 和 array_slice 組合使用便能夠?qū)崿F(xiàn)!下面貼代碼:

 1, "second" => 2, "third" => 3];
function beforeKey($array, $key) {
    $keys = array_keys($array);
      // $keys = [0 => "first", 1 => "second", 2 => "third"]
    $len = array_search($key, $keys);
    return array_slice($array, 0, $len);
}
var_dump(beforeKey($data, "first"));
// 結(jié)果 []
var_dump(beforeKey($data, "second"));
// 結(jié)果 ["first" => 1]
var_dump(beforeKey($data, "third"));
// 結(jié)果 ["first" => 1, "second" => 2]

思路解析,要實(shí)現(xiàn)這樣的功能大部分同學(xué)都應(yīng)該能想到 array_slice 函數(shù),但這個(gè)函數(shù)取出部分?jǐn)?shù)組是根據(jù)偏移量(可以理解為鍵名在數(shù)組中的順序,從 0 開始)而不是根據(jù)鍵名的,而關(guān)聯(lián)數(shù)組的鍵名卻是是字符串或者是不按順序的數(shù)字,此時(shí)要解決的問題便是「如何取到鍵名對(duì)應(yīng)的偏移量?」,這是 array_keys 函數(shù)便幫了我們大忙,它的功能是「返回?cái)?shù)組中部分的或所有的鍵名」默認(rèn)返回全部鍵名,此外返回的鍵名數(shù)組是以數(shù)字索引的,也就是說返回的鍵名數(shù)組的索引就是偏移量!例子中的原數(shù)組變?yōu)椋?[0 => "first", 1 => "second", 2 => "third"] 。然后我們通過 array_search 便可以獲得指定鍵名的偏移量了,因?yàn)檫@個(gè)函數(shù)的功能是「在數(shù)組中搜索給定的值,如果成功則返回首個(gè)相應(yīng)的鍵名」。有了偏移量我們直接調(diào)用 array_slice 函數(shù)便可以實(shí)現(xiàn)目的了。

上面的例子懂了,那獲取指定鍵名之后的數(shù)組也就輕而易舉了,略微修改 array_slice 即可。直接貼代碼:

 1, "second" => 2, "third" => 3];
function afterKey($array, $key) {
    $keys = array_keys($array);
    $offset = array_search($key, $keys);
    return array_slice($array, $offset + 1);
}
var_dump(afterKey($data, "first"));
// 結(jié)果 ["second" => 2, "third" => 3]
var_dump(afterKey($data, "second"));
// 結(jié)果 ["third" => 3]
var_dump(afterKey($data, "third"));
// 結(jié)果 []

那如何獲取指定值之前或之后的數(shù)組呢?嘿,記得 array_search 的作用吧,其實(shí)我們只需要這樣調(diào)用 beforeKey($data, array_search($value, $data)) 不就實(shí)現(xiàn)了嘛!

0x08 數(shù)組中重復(fù)次數(shù)最多的值

敲黑板,劃重點(diǎn)!據(jù)說這是一道面試題喔。假設(shè)有這樣一個(gè)數(shù)組 [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8],請(qǐng)問如何獲取數(shù)組中重復(fù)次數(shù)最多的值?關(guān)鍵就在于 array_count_values 函數(shù)。實(shí)例代碼如下:

 2, 11 => 4, 2 => 2, 4 => 3, 7 => 1, 8 => 1]
arsort($cv);
$max = key($cv);
var_dump($max);
// 結(jié)果 11

array_count_values 函數(shù)的功能是「統(tǒng)計(jì)數(shù)組中所有的值」,就是將原數(shù)組中的值作為返回?cái)?shù)組的鍵名,值出現(xiàn)的次數(shù)作為返回?cái)?shù)組的值。這樣我們便可以通過 arsort 函數(shù)對(duì)出現(xiàn)的次數(shù)進(jìn)行降序排序并且保持索引關(guān)聯(lián)。最后使用 key 獲得當(dāng)前單元(當(dāng)前單元默認(rèn)為數(shù)組第一個(gè)成員)的鍵名,此時(shí)的鍵名即是原數(shù)組的值重復(fù)次數(shù)最多的值。

0x09 打廣告時(shí)間

雖然 PHP 提供了很多和數(shù)組相關(guān)的函數(shù),但使用起來還是不算太方便而且都是通過函數(shù)的調(diào)用方式而沒有面向?qū)ο笙嚓P(guān)的實(shí)現(xiàn),所以我最近在寫一個(gè)開源的工具類項(xiàng)目 zane/utils,封裝了一些常用的方法并且支持鏈?zhǔn)秸{(diào)用,其中的 Ary 類實(shí)現(xiàn) 「獲取數(shù)組中重復(fù)次數(shù)最多的值」只需一行,如下所示:

$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8];
$max = Ary::new($data)->countValues()->maxKey();
var_dump($max);
// 結(jié)果 11

歡迎大家給我提 issue 和 pr,另外如果你喜歡這個(gè)項(xiàng)目希望動(dòng)動(dòng)小手點(diǎn)個(gè) star :-D

項(xiàng)目地址:https://github.com/zanemmm/utils

0x0A 結(jié)語

其實(shí)還有很多實(shí)用的函數(shù)沒有介紹,但是限于文章篇幅就講到這里了吧。本文出現(xiàn)的很多例子都并非本人原創(chuàng)的,多數(shù)出于 PHP 官方手冊(cè)(每個(gè)函數(shù)功能下面的評(píng)論里都有很多大神提出一些厲害的用法,部分示例就是出自評(píng)論)。在下只是拾人牙慧,將其總結(jié)了一下。另外文章中若出現(xiàn)錯(cuò)誤,希望大家能夠指出,若有疑問可以互相討論:-D。

我的博客原文

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/29171.html

相關(guān)文章

  • JavaScript巧學(xué)巧用

    摘要:希望通過以下幾點(diǎn)技巧讓大家的代碼化繁為簡,化簡為精。巧學(xué)巧用可能有人知道中提供了新的數(shù)據(jù)結(jié)構(gòu),但是能夠靈活運(yùn)用的人或許不多。利用數(shù)據(jù)結(jié)構(gòu)我們能夠輕松的去重一個(gè)數(shù)組,比如方法可以將結(jié)構(gòu)轉(zhuǎn)為數(shù)組。 關(guān)于 微信公眾號(hào):前端呼啦圈(Love-FED) 我的博客:勞卜的博客 知乎專欄:前端呼啦圈 前言 由于工作和生活上的一些變化,最近寫文章的頻率有點(diǎn)下降了,實(shí)在不好意思,不過相信不久就會(huì)慢慢...

    iflove 評(píng)論0 收藏0
  • ES6/JavaScript一些‘巧用

    摘要:前言第一次發(fā)表文章,如有不好的地方請(qǐng)見諒在編寫代碼的時(shí)候存在的一些方法和技巧,雖然有時(shí)候條條大路都通向羅馬,但是也許總會(huì)有那么一條最短的路徑可走。 前言 第一次發(fā)表文章,如有不好的地方請(qǐng)見諒/ 在編寫JavaScript代碼的時(shí)候存在的一些方法和技巧,雖然有時(shí)候條條大路都通向羅馬,但是也許總會(huì)有那么一條最短的路徑可走。本文將一些都知道卻不怎么用的小技巧分享給大家/ 一些小技巧 1.n...

    zsirfs 評(píng)論0 收藏0
  • ES6/JavaScript一些‘巧用

    摘要:前言第一次發(fā)表文章,如有不好的地方請(qǐng)見諒在編寫代碼的時(shí)候存在的一些方法和技巧,雖然有時(shí)候條條大路都通向羅馬,但是也許總會(huì)有那么一條最短的路徑可走。 前言 第一次發(fā)表文章,如有不好的地方請(qǐng)見諒/ 在編寫JavaScript代碼的時(shí)候存在的一些方法和技巧,雖然有時(shí)候條條大路都通向羅馬,但是也許總會(huì)有那么一條最短的路徑可走。本文將一些都知道卻不怎么用的小技巧分享給大家/ 一些小技巧 1.n...

    haoguo 評(píng)論0 收藏0
  • 巧用 Object.assign 合并小對(duì)象

    摘要:然而標(biāo)準(zhǔn)并沒有提供的反函數(shù)。首先把它轉(zhuǎn)換為對(duì)象數(shù)組注意箭頭后面的括號(hào)是必須的得到把他們合并起來。記得怎樣用扁平化數(shù)組么技巧類似完整代碼如下我發(fā)現(xiàn)越短的文章看的人越多,每周積累一些小技巧也是很好的新版中添加了作為的反函數(shù) 之前遇到過這樣一個(gè)問題,把下面一段服務(wù)器返回的文本 Server: 192.168.31.92:2181 zk_outstand...

    seanlook 評(píng)論0 收藏0
  • 個(gè)人整理, 閱讀過的好文章 (每天隨時(shí)更新)

    摘要:大家有好的文章可以在評(píng)論下面分享出來共同進(jìn)步本文鏈接數(shù)組使用之道程序員進(jìn)階學(xué)習(xí)書籍參考指南教你在不使用框架的情況下也能寫出現(xiàn)代化代碼巧用數(shù)組函數(shù)框架中間件實(shí)現(xiàn)沒錯(cuò),這就是面向?qū)ο缶幊淘O(shè)計(jì)模式需要遵循的個(gè)基本原則令人困惑的在中使用協(xié)程實(shí)現(xiàn)多任 大家有好的文章,可以在評(píng)論下面分享出來, 共同進(jìn)步! 本文github鏈接 php PHP 數(shù)組使用之道 PHP程序員進(jìn)階學(xué)習(xí)書籍參考指南 教你...

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

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

0條評(píng)論

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