Re: [問題] 去除JSON中重複的值再新增到網頁上

看板Ajax作者 (羽山)時間8年前 (2015/11/23 14:37), 8年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《flirmnave (焰離雨星)》之銘言: : 大家好 : 利用PHP由來源取得資料後 以JSON回傳 : JSON大致長這樣 : http://www.jsoneditoronline.org/?id=7d7865f63885c57fc18765b0c0bfa7ef : 然後要利用那些資料append到網頁上 : 而問題就在 取回來的資料是有重複的 : 例如上面的網址所呈現的JSON有三筆資料 : 但有兩筆是一樣的 : 想要讓他變成不重複的資料該怎麼做呢?? : 我有找到 unique() 這個方法 : 目前的作法是 大致是以下 : success: function(jsonData) { : var jsonList = jsonData.CourseList; //傳入的JSON : var jsonLength = jsonData.CourseList.length; //取JSON的長度 : var jsonInput = new Array(jsonLength); //新增空陣列 : for (var i = 0; i < jsonLength; i++) { //將JSON中的id複製到新陣列 : jsonInput[j] = jsonList[i]["id"]; : } : jsonInput = $.unique(jsonInput); //利用 unique() 去除重複值 : //最後用沒有重複值的 jsonInput 進行 append : 但是用這個方法 JSON 裡的 credit 就不見了 : 只剩下 id : 想請大家指點一下方向 : 該怎麼做才有辦法達成想要的效果呢? : 感謝大家 雖然有點複雜,不過從 php 下手的方式給你參考 <?php $a = ' { "CourseList": [ { "id": "6217", "credit": "4" }, { "credit": "4", "id": "6217" }, { "id": "41741", "credit": "3" } ] } '; $ma= json_decode($a,true); $ma["CourseList"]=array_map(function($values) use (&$arr){ return json_decode($values,true); },array_values(array_unique(array_map(json_encode, array_map(function($values) use (&$arr){ asort($values); return $values; },$ma["CourseList"]))))); //print_r($ma) echo json_encode($ma,true); php w.php { "CourseList": [ {"credit":"4","id":"6217"}, {"credit":"3","id":"41741"} ] } 我都看不懂我在寫什麼了 :D 總之就是把你的 CourseList 裡的 array 先把 key sort 一下 轉成 json string ,然後才去作 unique、重新定義array id 最後再反轉 json 回陣列 組出新的陣列內容 稍複雜了點,不好維護 因為整個內容都變json_string來比,所以一定要完全相同才會濾掉 如果只是要針對某個欄位如 id ,把 array_unique 改一下 http://php.net/manual/en/function.array-unique.php 參考有人寫好現成的 unique_multidim_array 會更簡單一點 另外用 array_map 是因為 json_decode 要強制以 array 方式出,不想用 stdclass 另外再寫一個json_decode_array 的function 就可以變的漂亮簡單 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.134.48.253 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1448260633.A.00C.html ※ 編輯: shadowjohn (140.134.48.253), 11/23/2015 14:41:54

11/23 23:06, , 1F
感謝您的回答 我會試試看的!!
11/23 23:06, 1F
文章代碼(AID): #1MKhGP0C (Ajax)
文章代碼(AID): #1MKhGP0C (Ajax)