您好,登錄后才能下訂單哦!
本篇內容介紹了“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_fliparray_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
0x03 數組去重
這個相信大家都有這個需求,當然 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_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
函數。
0x06 確認數組成員全部為真
有時候我們希望確認數組中的的值全部為 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' => 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')); // 結果 [] 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' => 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')); // 結果 ['second' => 2, 'third' => 3] var_dump(afterKey($data, 'second')); // 結果 ['third' => 3] var_dump(afterKey($data, 'third')); // 結果 []
那如何獲取指定值之前或之后的數組呢?嘿,記得 array_search
的作用吧,其實我們只需要這樣調用 beforeKey($data, array_search($value, $data))
不就實現了嘛!
0x08 數組中重復次數最多的值
敲黑板,劃重點!據說這是一道面試題喔。假設有這樣一個數組 [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數組函數的使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。