PHP裏面最強大的工具,就是數組,它融合了多種數據結構的特色,數組、隊列、棧、哈希表等等,並且容器能夠兼容各類類型,任意嵌套,簡直無所不能。圍繞着數組,PHP原生支持了一些列的函數,使得數組在實際編程實踐中,能夠有更強的表達能力和更高的編程效率。可是這要求咱們用PHP的方式去思考,儘可能使用PHP原生的函數解決問題,而不是掌握了一個foreach就一招鮮吃遍天。 php
本文談論的就是一個數組函數,array_reduce,我在文章的標題中,使用了「降維」這個詞語,由於我聯想到了《三體》裏面的維度攻擊,能把三維變二維,實現毀滅性打擊,array_reduce固然不是攻擊用的,可是array_reduce能夠幫助咱們實現降維,將一維數組「降維」成單一字符串。固然,array_reduce的能夠但不只限於實現這個功能,這取決於運用過程當中,程序員對問題的抽象能力。 程序員
這裏講一種應用場景:從數據庫中按照某種條件,取出一組記錄,而後按照某種規則,將某個特定字段,拼接成一個單一字符串。舉個簡單的例子,好比咱們常見的聯表查詢,若是兩張表,位於不一樣的DB,不一樣的物理機,甚至是經過開放API拉取回來的數據,那麼咱們可能無法使用簡單的聯表查詢,只能分步驟查詢,先查詢一個結果集,將結果集主鍵拼接成IN語句,再到另外一個DB去查詢結果集。 sql
這是很是常見的一種寫法,思路很是天然、直接,也未見什麼冗餘,可是我以爲,這不是PHP思考問題的方式。PHP的思考方式,是像這樣: 數據庫
我可能無法證實,第二種寫法,比第一種寫法要高多少效率,減小多少運行時間,可是我更提倡第二種寫法,由於第二種寫法,是按照PHP的方式在思考問題,提供了更好的語義,更強的表達,retrieve_ids函數還能夠複用在相似的場景裏。不少狀況下,函數裏大段的foreach遍歷,都並不是爲了表達業務自己,而只是爲了取得某種中間結果,而PHP提供了工具,幫助咱們避免這種局面,而讓本身的代碼更加簡潔易讀。這並不是炫耀什麼奇技淫巧,這只是PHP本身的正常的方式而已。 編程