zoukankan      html  css  js  c++  java
  • 算法:二维数组去重

    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)
            )
    
    )
  • 相关阅读:
    HDU 4738——Caocao's Bridges——————【求割边/桥的最小权值】
    POJ 3177——Redundant Paths——————【加边形成边双连通图】
    亲历:IT 从业者避免猝死攻略 v1.0
    Linux如何统计进程的CPU利用率
    gcp – 源于CP的高级命令行文件拷贝工具
    丰田栽了的原因,嵌入式软件工程师都该看看
    四件在我步入职业软件开发生涯那天起就该知道的事情
    浅谈自底向上的Shell脚本编程及效率优化
    实用硬件产品集锦
    [置顶] openHAB 体系结构与编程模型 (1) --- 术语
  • 原文地址:https://www.cnblogs.com/gentsir/p/14906982.html
Copyright © 2011-2022 走看看