1. 程式人生 > 其它 >演算法:二維陣列去重

演算法:二維陣列去重

1、需求
待授權裝置中存在同名則重新命名,以保證授權裝置名稱在資料庫中的唯一性

2、邏輯圖

3、程式碼

private function deduplicateDeviceName(&$dataset)
{
    if (!($sameset = $this->getDeviceSameset($dataset))) {
        return false;
    }
    foreach ($sameset as $originalDeviceName => &$partialSameset) {
        foreach ($partialSameset
as $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)
        )

)