引言
我們講解了很多種PHP陣列操作的引用場景。今天我們接著分享這方面的知識,說一說對於多維陣列,如何根據值搜尋,並返回陣列的索引值。
最開始我們習慣於跟隨本能寫程式碼,下意識地開始用 for 迴圈,對陣列進行遍歷,然後挨個比對,如果值相等,就返回索引值,如果沒有匹配上,就是不存在。
假如原始陣列是如下圖一樣的關聯陣列。
程式邏輯很簡單,我們使用程式碼實現一下:
function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val["uid"] === $id) { return $key; } } return null; }
這個函式接收一個值,與陣列,如果匹配上就將陣列的索引返回,如果不存在則返回 null。因為第一層結構沒有手動指定索引值,所以預設是從0開始的數字索引。
使用起來是這樣的:
$id = searchForId("100", $userdb);
執行結束後,輸出應該為0。
當然了,上面寫的函式具有通用性,對於特殊的案例,我們應該隨機應變。對於上述 $userdb 關聯陣列的結構,顯然,使用PHP內建的函式操作起來,更為直觀和快捷。
我們只需要先把 uid 列的元素全部取出,因為上層結構是預設數字索引,所以此處不用手動指定索引值;然後,在提取的陣列中搜索值,使用 array_search 執行返回鍵。
總結為程式碼,就一行:
$key = array_search("100", array_column($userdb, "uid"));
執行結果跟上面的 searchForId 函式一致。
$key = array_search(40489, array_column($userdb, "uid"));
但是如果在陣列中有重複的值,而 uid 列也不唯一,要把所有的匹配結果都返回,該怎麼做呢?不會又要修改 searchForId 函式,重新倒騰?
其實大可不必,PHP提供了這樣的功能,只需改用 array_keys 函式即可:
$keys = array_keys(array_column($userdb, "uid"), 40489);
你肯定經常使用 array_keys 函式用於返回整個陣列的鍵,但是它的第二個引數,恰恰是在指定時,擁有可搜尋的功能。這確實有些冷門。
再進一步。
上面返回的是陣列對應的鍵,那如果想要鍵和值一併關聯返回,一行程式碼能搞定嗎?可以的,修改一下就行了,使用 array_combine 函式將鍵和值組裝起來返回:
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);
本文透過特定的陣列搜尋需求,延伸到手動造輪子,把特殊的特性推向一般,並使用PHP內建的陣列處理函式,進行功能裁切,簡潔而高效。善用陣列函式是硬功夫。
Happy coding :_)
引言
我們講解了很多種PHP陣列操作的引用場景。今天我們接著分享這方面的知識,說一說對於多維陣列,如何根據值搜尋,並返回陣列的索引值。
學習時間最開始我們習慣於跟隨本能寫程式碼,下意識地開始用 for 迴圈,對陣列進行遍歷,然後挨個比對,如果值相等,就返回索引值,如果沒有匹配上,就是不存在。
假如原始陣列是如下圖一樣的關聯陣列。
程式邏輯很簡單,我們使用程式碼實現一下:
function searchForId($id, $array) { foreach ($array as $key => $val) { if ($val["uid"] === $id) { return $key; } } return null; }
這個函式接收一個值,與陣列,如果匹配上就將陣列的索引返回,如果不存在則返回 null。因為第一層結構沒有手動指定索引值,所以預設是從0開始的數字索引。
使用起來是這樣的:
$id = searchForId("100", $userdb);
執行結束後,輸出應該為0。
當然了,上面寫的函式具有通用性,對於特殊的案例,我們應該隨機應變。對於上述 $userdb 關聯陣列的結構,顯然,使用PHP內建的函式操作起來,更為直觀和快捷。
我們只需要先把 uid 列的元素全部取出,因為上層結構是預設數字索引,所以此處不用手動指定索引值;然後,在提取的陣列中搜索值,使用 array_search 執行返回鍵。
總結為程式碼,就一行:
$key = array_search("100", array_column($userdb, "uid"));
執行結果跟上面的 searchForId 函式一致。
$key = array_search(40489, array_column($userdb, "uid"));
但是如果在陣列中有重複的值,而 uid 列也不唯一,要把所有的匹配結果都返回,該怎麼做呢?不會又要修改 searchForId 函式,重新倒騰?
其實大可不必,PHP提供了這樣的功能,只需改用 array_keys 函式即可:
$keys = array_keys(array_column($userdb, "uid"), 40489);
你肯定經常使用 array_keys 函式用於返回整個陣列的鍵,但是它的第二個引數,恰恰是在指定時,擁有可搜尋的功能。這確實有些冷門。
再進一步。
上面返回的是陣列對應的鍵,那如果想要鍵和值一併關聯返回,一行程式碼能搞定嗎?可以的,修改一下就行了,使用 array_combine 函式將鍵和值組裝起來返回:
$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);
寫在最後本文透過特定的陣列搜尋需求,延伸到手動造輪子,把特殊的特性推向一般,並使用PHP內建的陣列處理函式,進行功能裁切,簡潔而高效。善用陣列函式是硬功夫。
Happy coding :_)