很簡單的一個需求,將數據庫取出的二維數組進行按照id分組,同組的數據用逗號連接,例如:
處理為
就是按照id分組,name進行逗號拼接。
那么按照數據庫的思路來說,采用group_concat即可,如果有重復,可使用group_concat(distinct 字段) 即可。(這是有風險的,當數據量足夠多的時候會超出group_concat的極限,到時候出現數據截斷)
對於PHP而言,可以用很多種方式處理,網友們給出他的解法千奇百怪,但是效率都不是太高,雙重循環解決問題可讀性也不好,下面我總結幾種自己考慮出來的方式。
解法1:
先循環一次以id做鍵,處理為數組,然后再次循環,將name下面的數組轉字符串。復雜度:≤2n
解法2:
減少第二次循環,直接用拼接解決
這個做了isset判斷,如果有則拼接,如果沒有,則賦值,按道理說這里已經完成了,后面用array_values是為了將數組轉為索引數組。復雜度:n+array_values函數調用一次
解法3:
去掉array_values處理最后的數組索引問題,直接一步到位索引。
這里采用i自增方法,做鍵值對映射到hash中去,直接明確了索引元素的位置,直接賦值,但是測試發現,這個執行時間的效率並沒有array_values高,可能是array_values底層采用c語言編寫,這個數組索引賦值等過程的操作可能有些緩慢,這也可能和內存有關,空間換時間,提高重置索引效率。復雜度:n
總之,這幾個辦法都已經是很簡便的快捷辦法了,最大限度的利用id進行分組索引化,讓id做鍵去處理數組,其中心思想是同一種。