演算法:二維陣列去重
阿新 • • 發佈:2021-06-20
1、需求
待授權裝置中存在同名則重新命名,以保證授權裝置名稱在資料庫中的唯一性
2、邏輯圖
3、程式碼
private function deduplicateDeviceName(&$dataset) { if (!($sameset = $this->getDeviceSameset($dataset))) { return false; } foreach ($sameset as $originalDeviceName => &$partialSameset) { foreach ($partialSamesetas $key => &$name) { static $flag = 0; ++$flag; $name .= '(' . $flag . ')'; unset($key); } $this->isExistInDatabase($dataset, $partialSameset, $originalDeviceName, $flag); $flag = 0; unset($originalDeviceName); }unset($sameset); // 按裝置名稱升序排列 $sortByNameLowercase = array_map('strtolower', array_column($dataset, 'server_name')); array_multisort($sortByNameLowercase, SORT_ASC, SORT_STRING, $dataset); } private function getDeviceSameset($dataset) { if (empty($dataset)) { return false; }$sameset = []; $repeatTimes = array_count_values(array_column($dataset, 'server_name')); foreach ($dataset as $key => $item) { if (!isset($item['server_name'], $repeatTimes[$item['server_name']])) { continue; } if ( $repeatTimes[$item['server_name']] < 2 && !$this->pluto_device->name_exists($item['server_name'], null, false) ) { continue; } $device = $item['server_name']; $sameset[$device][$key] = $device; unset($device, $key, $item); } return $sameset; } /** * 裝置名是否存在於資料庫中 * * @todo 取資料庫中已存在的裝置名字尾作為$flag,保證裝置名稱字尾的連續性 * @param array $dataset 原始待授權裝置 * @param array $partialSameset 按同名分組後的裝置 * @param string $originalDeviceName 同名裝置原始名稱 * @param int $flag 重新命名裝置用的數字字尾標標記 * @return bool|null */ private function isExistInDatabase(&$dataset, &$partialSameset, $originalDeviceName, $flag) { if (!$this->pluto_device->name_exists(array_values($partialSameset), null, false)) { foreach ($partialSameset as $key => $name) { $dataset[$key]['server_name'] = $name; unset($key, $name); } return false; } foreach ($partialSameset as $key => &$name) { ++$flag; $name = $originalDeviceName . '(' . $flag . ')'; $dataset[$key]['server_name'] = $name; } $this->isExistInDatabase($dataset, $partialSameset, $originalDeviceName, $flag); }
4、實現效果
database.pluto_device list
947645681 oracle-6-9 4 1 192.168.8.119 1541158513 3374036272 oracle-7-0 4 1 192.168.8.118 1541158505 1591878207 WIN-DKD4QL4TDAA(2) 4 2 192.168.8.120 1541384920 3867940323 oracle-7-0(4) 4 2 192.168.8.117 1542091640 1179277971 oracle-7-0(1) 4 2 192.168.8.116 1542091693 199481921 oracle-7-0(2) 4 2 192.168.8.115 1542091732
waitingAuthDevice list
$dataset = [ [ 'ip' => '192.168.8.100', 'platform' => '1', 'server_name' => 'oracle-7-0', ], [ 'ip' => '192.168.8.101', 'platform' => '2', 'server_name' => 'WIN-DKD4QL4TDAA', ], [ 'ip' => '192.168.8.102', 'platform' => '3', 'server_name' => 'oracle-7-0', ], [ 'ip' => '192.168.8.103', 'platform' => '4', 'server_name' => 'WIN-DKD4QL4TDAA', ], [ 'ip' => '192.168.8.104', 'platform' => '5', 'server_name' => 'oracle', ], [ 'ip' => '192.168.8.105', 'platform' => '6', 'server_name' => 'oracle-6-9', ], [ 'ip' => '192.168.8.106', 'platform' => '7', 'server_name' => 'oracle-7-0', ], ];
var_dump($this->deduplicateDeviceName($dataset));
Array ( [0] => Array ( [ip] => 192.168.8.104 [platform] => 5 [server_name] => oracle ) [1] => Array ( [ip] => 192.168.8.105 [platform] => 6 [server_name] => oracle-6-9(1) ) [2] => Array ( [ip] => 192.168.8.100 [platform] => 1 [server_name] => oracle-7-0(7) ) [3] => Array ( [ip] => 192.168.8.102 [platform] => 3 [server_name] => oracle-7-0(8) ) [4] => Array ( [ip] => 192.168.8.106 [platform] => 7 [server_name] => oracle-7-0(9) ) [5] => Array ( [ip] => 192.168.8.101 [platform] => 2 [server_name] => WIN-DKD4QL4TDAA(3) ) [6] => Array ( [ip] => 192.168.8.103 [platform] => 4 [server_name] => WIN-DKD4QL4TDAA(4) ) )