回覆列表
  • 1 # 程式設計師小助手

    引言

    我們講解了很多種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 :_)

  • 中秋節和大豐收的關聯?
  • 《愛情公寓5》再陷抄襲風波是怎麼回事?