您好,登錄后才能下訂單哦!
一個數據組的篩選器:對一個二維母數組$motherArr,經過一個由N條苛刻條件組成的篩選器的篩選,獲取到進入篩選器數據組成的子數組$sonFirArr和篩選器外的數據組成的子數組$sonSecArr,然后隨機從子數組$sonFirArr中取出(count($sonFirArr)*m%)個元素,得到孫數組$grandsonFirArr,進一步獲取母數組$motherArr中對孫數組$grandsonFirArr的互補孫數組$grandsoSecArr,即孫數組$grandsonFirArr和孫數組$grandsoSecArr為我們需要的結果。
具體處理如下:
1,遍歷母數組$motherArr,篩選器外的記錄放入一個新數組(子數組$sonFirArr),同時對母數組unset()該條記錄(生成子數組$sonSecArr)
if($sellerParent || $buyerParent){ $orderArr[$i] = $order; unset($orders[$i]); continue; } if($sellerSpreadCount <= 10 || $buyerSpreadCount <= 10){ $orderArr[$i] = $order; unset($orders[$i]); continue; } if($order['spreadseller'] > 3 || $order['spread'] > 3){ $orderArr[$i] = $order; unset($orders[$i]); continue; }
注意:篩選條件中存在一個前10條的篩選,而此10條的記錄是在篩選后的篩選器外的結果遍歷時產生的,如果從對應的表里查詢是不可取的;如果采用緩存記錄條數,也不可以放在篩選器外的結果遍歷時;因為如果10條的界點正好在篩選后執行的遍歷時,同時其內出現了符合篩選條件的11,12等條。所以我在篩選遍歷時對符合產生“前10條”的記錄進行緩存記錄數值
if ($order['spread']>0 && isset($userRelations[$bid])) { $userRelation = $userRelations[$bid]; $parentid = $userRelation['parentid']; $buyerSpreadCount = $this->xmcache->get("spread_".$userRelation['id']); if($buyerSpreadCount){ $this->xmcache->setEx("spread_".$userRelation['id'],3600*24*30*6,$buyerSpreadCount+1); }else{ $this->xmcache->setEx("spread_".$userRelation['id'],3600*24*30*6,1); } if(in_array($parentid, $whiteUserArr)){ $buyerParent = true; } }
這里我想說,遍歷內,如果取固定字段的另一組信息,這樣設置:將二維數組的索引設為改固定字段值,如上文對$userRelations的處理。
2,編寫隨機獲取某一數組的一定數量的元素,這個方法里主要通過隨機獲取數組索引方式從而達到需求,當然您還可以嘗試打亂數組的方式:shuffle()
注意:沒被隨機選中的元素也被返回了
private function getRandElements($array = array(), $ratio){ if(empty($array) || !is_array($array)){ return array('deductResult'=>array(),'resultArr'=>array()); } if (!$ratio) { return array('deductResult'=>array(),'resultArr'=> $array); } $key = array_rand($array,ceil(count($array)*$ratio)); if(!is_array($key)){ $key = [$key]; } $deductResult = $resultArr = array(); foreach($key as $val){ $deductResult[] = $array[$val]; } foreach ($array as $k => $v) { if(!in_array($k,$key)){ $resultArr[$k] = $v; } } return array('deductResult'=>$deductResult,'resultArr'=>$resultArr); }
3,上步獲取到$grandsonFirArr即最終的篩選器結果,如何獲取母數組$motherArr中對孫數組$grandsonFirArr的互補孫數組$grandsoSecArr?我們記得步1中的篩選外的數組$orderArr和步2中隨機外的部分$resultArr,如果合并兩者是不是就可以了?
$newOrderArr = array_merge($orderArr,$returnRes['resultArr']);
即$grandsonSecArr。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。