台灣最大程式設計社群網站
線上人數
1282
 
會員總數:245132
討論主題:189038
歡迎您免費加入會員
討論區列表 >> PHP >> 多維陣列搜尋 並重組陣列
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
多維陣列搜尋 並重組陣列
價值 : 50 QP  點閱數:1495 回應數:6

樓主

A-Wei
門外漢
0 7
264 28
發送站內信

捐贈 VP 給 A-Wei
多維陣列的搜尋方式
我有在此版找到array_search方法
也有找到自製function的搜尋方法

不過..我有個進階一點的想法..尚未找到相關資訊..

我有一組多維陣列
如下:
Array([0]=>Array([id]=>01[name]=>Jack[interest]=>football)
[1]=>Array([id]=>02[name]=>Mary[interest]=>playcomputer)
[2]=>Array([id]=>03[name]=>Mark[interest]=>basketball)
[3]=>Array([id]=>04[name]=>Johny[interest]=>bolling)
[4]=>Array([id]=>05[name]=>Jassica[interest]=>golf)
[5]=>Array([id]=>06[name]=>Joeseph[interest]=>basketball))

我想輸入關鍵字搜尋,並重組一串新的陣列
例如關鍵字為"ball"
則輸出結果如下:
Array([0]=>Array([id]=>01[name]=>Jack[interest]=>football)
[1]=>Array([id]=>03[name]=>Mark[interest]=>basketball)
[2]=>Array([id]=>06[name]=>Joeseph[interest]=>basketball))

我用以下function做巢狀搜尋
如下:


此種方式只會輸出
Array([0]=>Array([0]=>football)[1]=>[2]=>Array([0]=>basketball)[3]=>[4]=>[5]=>Array([0]=>basketball))

我目的是想將一筆龐大的陣列資料做關鍵字搜尋
並以json_encode的方式丟到前端的ExtJS顯示給使用者看
請問如何修改上面的程式
已得到我要的結果?
或是說還有更好的方法做搜尋呢?


別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
不錯的參考

clouding
捐贈 VP 給 clouding 檢舉此回應
嗨早安
通常這種龐大的資料
應該都會放到資料庫去處理查詢效能上會比較好
我也不知道你怎麼取得這種陣列資料的
這種寫法當資料量大的時候效能會明顯吃很重
會多做很多不需要的動作
比如說你可能只想要查詢interest這個欄位的資料
不過id name 也做了搜尋的動作
所以我覺得放到資料庫做搜尋在做處理會容易許多
本篇文章回覆於2016-12-13 11:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
其實#1說的很對,可以的話最好還是用db來幫你處理會比較安全。
如果非得要用陣列的處理。原則上我會建議用雙函數的處理



不過如果資料真的很大,你就得需要考量一個重點。
你要知道變數有其最大容許值存在。而且json當資料量達到一定程度,就會變成空值處理
基本上最好還是放在db上跑搜尋會比較安全。
以上的方式給你參考。
本篇文章回覆於2016-12-13 17:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

A-Wei
捐贈 VP 給 A-Wei 檢舉此回應
兩位說的我理解
大資料量的確用DB做會比較合適
但..我的資料來源類似於在CMD下指令而輸出的結果
所以才會變成陣列
不過..為了防止陣列過於龐大..
我有限制輸出的量~
所以不至於有資料過大問題

星空大的程式我沒試~
不過您的程式原理..
我大致了解了~
原先我的程式是以一個副程式對自己重複呼叫
已完成二維陣列的提取~
而星空大的卻是以兩個副程式對二為做提取動作
似乎是個不錯的方式

不過我用了完全不一樣的方法製作
因為我的最終目的是重新組一個新陣列
並轉為json格式
所以用了以下方法~
給大家參考參考~(這個方法有成功唷)


本篇文章回覆於2016-12-14 08:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

clouding
捐贈 VP 給 clouding 檢舉此回應
嗨早安
你這個方法好像行不通耶
如果要做大概像這樣
不知道是不是我理解錯誤
去白換行我就不做了


本篇文章回覆於2016-12-14 09:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
針對你#3的程式碼跟你說幾個問題

1.陣列如果不是很特別的需要,盡量使用foreach來做處理。不要用for。
因為用for還得給他count的值

2.for堶捱伅q不要用函數來跑,程式效能比較不好。

3.你後來寫的方式,其實就比較沒有萬用型的了。因為key值已經被固定住了。
如果未來有機會再增加欄位的話,你就得再來改一次程式。

我給你的程式碼其實不單單是用雙函數而已。其還包含了萬用型的做法。
其原理是將判斷及取資料分開處理。
本篇文章回覆於2016-12-14 10:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

A-Wei
捐贈 VP 給 A-Wei 檢舉此回應
我後來有試過星空大的方法

確實我的部分是少考慮了新增欄位的問題

不過我的資料來源是來自git log而來

欄位基本是固定的

所以我才會只下判斷式判斷其中一個欄位

至於您說的for和foreach問題

因為我git log的資料量我有設計讓git log只抓前10筆紀錄...

所以效能問題不大

未來如果有機會處理大資料~

我會去實驗~謝謝您告訴我這樣的知識~^^

本篇文章回覆於2016-12-16 11:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.