1,'name' => 'channel-ctl-oil-common-limit'], ['quality'=> 2,'name' => 'channel-ctl-oil-fast-limit'], ['quality'=> 1,'name' => 'channel-ctl-phone-common-limit'], ['quality'=> 2,'name' => 'channel-ctl-phone-fast-limit'] ]; public function __construct() { $this->mSpeedtable = []; } public function load() { $this->mSpeedtable = []; foreach (self::$cache_names as $cache) { $quality = $cache['quality']; $cache_name = $cache['name']; $data = rcache($cache_name,"provider-"); $data = unserialize($data['data']); $cfgs = empty($data) ? [] : $data; foreach ($cfgs as $items) { foreach ($items as $item) { $name = $item['name']; $amount = $item['amount']; $card_type = $item['type']; $opened = $item['opened'] == 1 ? true : false; $sort = $item['sort']; $speed = $item['speed']; $key = $this->prefix($name,$amount,$card_type,$quality); $this->mSpeedtable[$key] = new ctl_item($name,$card_type,$amount,$speed,$sort,0,$opened); } } } } public function match($names,int $spec, int $card_type,int $quality) { $ctl_items = []; foreach ($names as $name) { $key = $this->prefix($name,$spec,$card_type,$quality); if(array_key_exists($key,$this->mSpeedtable)) { $ctl_items[] = $this->mSpeedtable[$key]; } } if(empty($ctl_items)) { return $names; } $usable_items = []; foreach ($ctl_items as $item) { if($item->opened()) { $usable_items[] = $item; } } $ascending = function ($l, $r) { $lproity = $l->priority(); $rproity = $r->priority(); $lover = $l->speed_overload() ? 1 : 0; $rover = $r->speed_overload() ? 1 : 0; if($lover == $rover) { return $lproity < $rproity ? -1 : 1; } else { return $lover < $rover ? -1 : 1; } }; usort($usable_items, $ascending); $result = []; foreach ($usable_items as $item) { $result[] = $item->name(); } return $result; } private function prefix($name,$spec,$card_type,$quality) { return "{$name}-{$spec}-{$card_type}-{$quality}"; } }