[請益] 怎麼更有效判斷陣列是否沒有重覆的值

看板PHP作者時間13年前 (2012/12/13 11:35), 編輯推噓3(3014)
留言17則, 3人參與, 最新討論串1/1
我有一個二維陣列 像這樣 array ( 0=>['no'=>1,'name'=>'name'], 1=>['no'=>2,'name'=>'name2'], 依此類堆 那我要怎麼知道 no 裡面有沒有重覆的值 在不執行foreach的情況下呢 我本來是想用array_unique 來檢查回傳的陣列數量是不是跟原本的數量一樣大 但是這個問題是會連name也判斷到,我只想確認no有沒有重覆 請問沒有在不執行迴圈的情況下去檢查有沒有重覆 謝謝回答 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.82.97.139

12/13 11:53, , 1F
必須把no取出, 即使你寫的php code沒有loop, runtime還是會去
12/13 11:53, 1F

12/13 11:54, , 2F
loop的, 而且效率不一定比自己刻foreach好, 當然為了可讀性可
12/13 11:54, 2F

12/13 11:55, , 3F
以用array_map, array_filter來loop取出no來判斷
12/13 11:55, 3F

12/13 11:58, , 4F
array_unique(array_map(function($i) { return $i['no'];},
12/13 11:58, 4F

12/13 11:59, , 5F
$arr));
12/13 11:59, 5F

12/13 12:00, , 6F
像這樣會loop兩次
12/13 12:00, 6F

12/13 12:01, , 7F
$pool = array();
12/13 12:01, 7F

12/13 12:03, , 8F
$checked = array_filter($array, function($i) use(&$pool){
12/13 12:03, 8F

12/13 12:03, , 9F
if(isset($pool[$i['no']])) return $i;
12/13 12:03, 9F

12/13 12:04, , 10F
$pool[$i['no']] = true;
12/13 12:04, 10F

12/13 12:04, , 11F
return NULL;
12/13 12:04, 11F

12/13 12:04, , 12F
});
12/13 12:04, 12F

12/13 12:06, , 13F
如上只loop一次就取出重複, 但是跟foreach沒啥兩樣了
12/13 12:06, 13F

12/13 12:08, , 14F
如果只是要檢查有沒有重複, foreach裡還可以continue; 反而
12/13 12:08, 14F

12/13 12:08, , 15F
更快
12/13 12:08, 15F

12/13 12:45, , 16F
php在這種時候還蠻麻煩的說.... orz
12/13 12:45, 16F

12/13 15:05, , 17F
所以結論是沒有現成的方法囉
12/13 15:05, 17F
文章代碼(AID): #1GoKpvQJ (PHP)
文章代碼(AID): #1GoKpvQJ (PHP)