亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php數組函數有哪些操作?php數組函數的應用(附

2020-03-22 19:28:08
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于php數組函數有哪些操作?php數組函數的應用(附代碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

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

取指定鍵名

對于某些關聯數組,有時候我們只想取指定鍵名的那部分,比如數組為 [ id = 1, name = zane , password = 123456 ] 此時若只想取包含 id 和 name 的部分該怎么實現呢?下面直接貼代碼。

 ?php$raw = [ id = 1, name = zane , password = 123456 // 自己用 PHP 實現function onlyKeys($raw, $keys) { $new = []; foreach ($raw as $key = $val) { if (in_array($key, $keys)) { $new[$key] = $val; return $new;// 用 PHP 內置函數實現function newOnlyKeys($array, $keys) { return array_intersect_key($array, array_flip($keys));var_dump(onlyKeys($raw, [ id , name ]));// 結果 [ id = 1, name = zane ]var_dump(newOnlyKeys($raw, [ id , name ]));// 結果 [ id = 1, name = zane ]

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

移除指定鍵名

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

 ?php$raw = [ id = 1, name = zane , password = 123456 // 用 PHP 內置函數實現function removeKeys($array, $keys) { return array_diff_key($array, array_flip($keys));// 移除 id 鍵var_dump(removeKeys($raw, [ id , password ]));// 結果 [ name = zane ]

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

數組去重

這個相信大家都有這個需求,當然 PHP 也內置了 array_unique 函數供給大家使用,如下例:

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

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

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

因為這個函數會先將數組進行排序,所以速度可能在某些場景達不到預期的要求。

現在我們可以祭出我們的黑科技 array_flip 函數,眾所周知 PHP 里數組的鍵名是唯一的,所以在鍵名和值對調后重復的值便被忽略了。試想一下我們連續調用兩次 array_flip 函數是不是就相當于實現了 array_unique 函數的功能呢?示例代碼如下:

 ?php$input = [ you are = 666, i am = 233, he is = 233, she is = 666];$result = array_flip(array_flip($input));var_dump($result);// 結果 [ she is = 666, he is = 233]

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

如果同一個值出現多次,則最后一個鍵名將作為它的值,其它鍵會被丟棄。

總的來說就是 array_unique 保留第一個出現的鍵名,array_flip 保留最后一個出現的鍵名。

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

此外,若不需要保留鍵名我們可以直接這樣使用 array_html' target='_blank'>values(array_flip($input))。

0x04 重置索引

當我們想要對一個索引并不連續的數組進行重置時,比如數組:[0 = 233, 99 = 666],對于這種數組我們只需要調用 array_values 函數即可實現。如下例:

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

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

 ?php$input = [ hello = world , 0 = 233, 99 = 666];var_dump(array_slice($input, 0));// 結果 [ hello = world , 0 = 233, 1 = 66]

array_slice 函數的功能是取出數組的中的一段,但它默認會重新排序并重置數組的數字索引,所以可以利用它重置數組中的數字索引。

清除空值

嘿,有時候我們想清除某個數組中的空值比如:null、false、0、0.0、[]空數組、 空字符串、 0 字符串0 ,這時 array_filter 函數便能幫上大忙。代碼如下:

 ?php$input = [ foo , false, -1, null, , []];var_dump(array_filter($input));// 結果 [0 = foo , 2 = -1]

為什么會出現這樣的結果捏?array_filter 的作用其實是「用回調函數過濾數組中的單元」,它的第二個參數其實是個回調函數,向數組的每個成員都執行這個回調函數,若回調函數的返回值為 true 便保留這個成員,為 false 則忽略。這個函數還有一個特性就是:

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

等值為 false 就是轉換為 bool 類型后值為 false 的意思,詳細看文檔:轉換為布爾類型。

注意:如果不填寫 callback 函數,0、0.0、 0 字符串0 這些可能有意義的值會被刪除。所以如果清除的規則有所不同還需要自行編寫 callback 函數。

確認數組成員全部為真

有時候我們希望確認數組中的的值全部為 true,比如:[ read = true, write = true, execute = true],這時我們需要用一個循環判定嗎?NO,NO,NO……只需要用 array_product 函數便可以實現了。代碼如下:

 ?php$power = [ read = true, write = true, execute = true];var_dump((bool)array_product($power));// 結果 true$power = [ read = true, write = true, execute = false];var_dump((bool)array_product($power));// 結果 false

為什么能實現這個功能呢? array_product 函數本來的功能是「計算數組中所有值的乘積」,在累乘數組中所有成員的時候會將成員的值轉為數值類型。當傳遞的參數為一個 bool 成員所組成的數組時,眾所周知 true 會被轉為 1,false 會被轉為 0。然后只要數組中出現一個 false 累乘的結果自然會變成 0,然后我們再將結果轉為 bool 類型不就是 false 了嘛!

注意:使用 array_product 函數將在計算過程中將數組成員轉為數值類型進行計算,所以請確保你了解數組成員轉為數值類型后的值,否則會產生意料之外的結果。比如:

 ?php$power = [ read = true, write = true, execute = true var_dump((bool)array_product($power));// 結果 false

上例是因為 true 在計算過程中被轉為 0。要想詳細了解請點擊這里。

獲取指定鍵名之前 / 之后的數組

如果我們只想要關聯數組中指定鍵名值之前的部分該怎么辦呢?又用一個循環?當然不用我們可以通過 array_keys、array_search 和 array_slice 組合使用便能夠實現!下面貼代碼:

 ?php$data = [ first = 1, second = 2, third = 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 // 結果 []var_dump(beforeKey($data, second // 結果 [ first = 1]var_dump(beforeKey($data, third // 結果 [ first = 1, second = 2]

思路解析,要實現這樣的功能大部分同學都應該能想到 array_slice 函數,但這個函數取出部分數組是根據偏移量(可以理解為鍵名在數組中的順序,從 0 開始)而不是根據鍵名的,而關聯數組的鍵名卻是是字符串或者是不按順序的數字,此時要解決的問題便是「如何取到鍵名對應的偏移量?」,這是 array_keys 函數便幫了我們大忙,它的功能是「返回數組中部分的或所有的鍵名」默認返回全部鍵名,此外返回的鍵名數組是以數字索引的,也就是說返回的鍵名數組的索引就是偏移量!例子中的原數組變為: [0 = first , 1 = second , 2 = third ] 。然后我們通過 array_search 便可以獲得指定鍵名的偏移量了,因為這個函數的功能是「在數組中搜索給定的值,如果成功則返回首個相應的鍵名」。有了偏移量我們直接調用 array_slice 函數便可以實現目的了。

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

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

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

數組中重復次數最多的值

敲黑板,劃重點!據說這是一道面試題喔。假設有這樣一個數組 [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8],請問如何獲取數組中重復次數最多的值?關鍵就在于 array_count_values 函數。實例代碼如下:

 ?php$data = [6, 11, 11, 2, 4, 4, 11, 6, 7, 4, 2, 11, 8];$cv = array_count_values($data);// $cv = [6 = 2, 11 = 4, 2 = 2, 4 = 3, 7 = 1, 8 = 1]arsort($cv);$max = key($cv);var_dump($max);// 結果 11

array_count_values 函數的功能是「統計數組中所有的值」,就是將原數組中的值作為返回數組的鍵名,值出現的次數作為返回數組的值。這樣我們便可以通過 arsort 函數對出現的次數進行降序排序并且保持索引關聯。最后使用 key 獲得當前單元(當前單元默認為數組第一個成員)的鍵名,此時的鍵名即是原數組的值重復次數最多的值。

總結

雖然 PHP 提供了很多和數組相關的函數,但使用起來還是不算太方便而且都是通過函數的調用方式而沒有面向對象相關的實現,所以我最近在寫一個開源的工具類項目 zane/utils,封裝了一些常用的方法并且支持鏈式調用,其中的 Ary 類實現 「獲取數組中重復次數最多的值」只需一行,如下所示:

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

相關文章推薦:

如何用PHP讀取excel文件內容、獲取單元格數據

php設計模式:淺談php單例模式(附代碼)

以上就是php數組函數有哪些操作?php數組函數的應用(附代碼)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线观看| 亚洲电影免费观看高清完整版| 国产精品丝袜久久久久久不卡| 国产亚洲视频中文字幕视频| 中文字幕精品在线| 成人性生交大片免费看视频直播| 国产成人精品视| 全亚洲最色的网站在线观看| 久久精品国产久精国产一老狼| 欧美激情一级二级| 欧美一区二区视频97| 国产日韩欧美在线播放| 久久久极品av| 91国内免费在线视频| 国产成人鲁鲁免费视频a| 日韩禁在线播放| 97精品国产97久久久久久免费| 精品欧美激情精品一区| 97在线观看视频| 亚洲天堂色网站| 久久亚洲精品中文字幕冲田杏梨| 国内精久久久久久久久久人| 成人动漫网站在线观看| 精品视频久久久久久久| 国产91精品青草社区| 欧美极品欧美精品欧美视频| 日韩高清中文字幕| 精品国产鲁一鲁一区二区张丽| 欧美夜福利tv在线| 欧美孕妇毛茸茸xxxx| 亚洲va久久久噜噜噜| 欧美一区三区三区高中清蜜桃| 亚洲欧洲第一视频| 中文精品99久久国产香蕉| 国产精品无av码在线观看| 91成人天堂久久成人| 亚洲性生活视频| 538国产精品一区二区免费视频| 午夜免费日韩视频| 欧美精品性视频| 在线观看欧美视频| 欧美精品videosex性欧美| 成人网页在线免费观看| 久久久成人的性感天堂| 亚洲色图国产精品| 国产一区二区在线播放| 国产不卡在线观看| 一本色道久久88综合日韩精品| 亚洲色图偷窥自拍| 91精品国产99久久久久久| 日韩在线一区二区三区免费视频| 免费91麻豆精品国产自产在线观看| 欧美日韩高清在线观看| 91精品国产99| 狠狠爱在线视频一区| 亚洲免费小视频| 国产精品男人的天堂| 国产亚洲精品成人av久久ww| yellow中文字幕久久| 欧美激情精品在线| 亚洲的天堂在线中文字幕| 精品一区二区三区四区在线| 亚洲第一区中文99精品| 久久综合伊人77777尤物| 久久av红桃一区二区小说| 成人做爽爽免费视频| 久久久噜久噜久久综合| 日韩在线高清视频| 精品国模在线视频| 91久久精品在线| 疯狂欧美牲乱大交777| 精品久久久久久久久久国产| 久久精品一偷一偷国产| 国产噜噜噜噜久久久久久久久| 97免费视频在线播放| 日韩av在线看| 精品一区二区亚洲| 亚洲第一av在线| 亚洲护士老师的毛茸茸最新章节| 91成人福利在线| 久久人人爽人人爽爽久久| 国产精品视频午夜| 色狠狠av一区二区三区香蕉蜜桃| 午夜精品福利视频| 亚洲成人亚洲激情| 欧美日韩国产二区| 日韩欧美精品中文字幕| 亚洲精品白浆高清久久久久久| 日韩在线视频网站| 日韩欧美a级成人黄色| 国产成人久久久精品一区| 日韩精品一区二区三区第95| 成人免费观看网址| 欧美日韩国产丝袜另类| 国产在线视频一区| 国产精品草莓在线免费观看| 亚洲网站在线看| 91九色国产在线| 欧美激情视频播放| 国产精品久久久久久久久久99| 国产精品一香蕉国产线看观看| 2020久久国产精品| 精品久久久一区二区| 国产在线精品成人一区二区三区| 精品久久久精品| 亚洲电影免费观看高清完整版在线观看| 中文字幕免费精品一区| 亚洲欧美福利视频| 欧美精品日韩www.p站| 久久国产精品网站| 国产精品一区二区女厕厕| 日韩av免费网站| 欧美精品成人91久久久久久久| 亚洲精品按摩视频| 国产精品视频男人的天堂| 欧美国产亚洲精品久久久8v| 日韩大片免费观看视频播放| 国产精品va在线播放| 久久视频国产精品免费视频在线| 亚洲福利在线播放| 国产美女久久精品香蕉69| 欧美精品aaa| 日韩电影免费在线观看中文字幕| 久久资源免费视频| 日韩av电影国产| 亚洲成人精品久久久| 日韩成人在线视频| 国产精品第七影院| 国产成人综合av| 欧美一区二区三区……| 91chinesevideo永久地址| 亚洲精品一区中文字幕乱码| 日韩中文字幕国产| 日韩一区视频在线| 欧美日韩精品国产| 26uuu亚洲国产精品| 亚洲高清福利视频| 精品久久久久久久大神国产| 欧美日韩在线免费观看| 日韩hd视频在线观看| 深夜成人在线观看| 91成人国产在线观看| 久久久亚洲影院你懂的| 精品美女永久免费视频| 日本91av在线播放| 国产精品久久久久久久久久小说| 久久在线精品视频| 亚洲国产欧美一区| 日韩高清免费观看| 欧美激情喷水视频| 91精品国产亚洲| 欧美在线视频免费| 精品视频中文字幕| 色噜噜狠狠狠综合曰曰曰| 欧美麻豆久久久久久中文| 国产97在线视频| 日韩av影院在线观看| 亚洲欧美国产日韩天堂区| 亚洲电影在线看| 欧美一级电影久久| wwwwwwww亚洲| 日韩va亚洲va欧洲va国产| 91亚洲精品久久久久久久久久久久| 久久av中文字幕|