> 技术文档 > php算法-- 关联数组使用,优化sip账号去重

php算法-- 关联数组使用,优化sip账号去重


文章目录

      • 1 变量定义
      • 2. 核心特性
      • code

1 变量定义

  • 类型:嵌套的关联数组(Nested Associative Array)
  • 外层结构:[中继ID => 账号列表]
  • 键 (Key):中继ID(字符串或整型)
  • 值 (Value):索引数组(包含属于该中继的所有SIP账号字符串)

内存形态:
php
[
“中继ID_A” => [“账号1”, “账号2”, …],
“中继ID_B” => [“账号X”, “账号Y”, …]
]


数据结构存储
// 初始状态
$existingAccounts = [
“2” => [“1001”],
“5” => [“2001”]
];

// 添加新账号到中继2
$existingAccounts[“2”][] = “1002”;

// 添加新中继组
$existingAccounts[“9”] = [“3001”];

// 最终形态
[
“2” => [“1001”, “1002”],
“5” => [“2001”],
“9” => [“3001”]
]


2. 核心特性

特性 说明 按中继分组 以中继ID为分组维度,天然隔离不同中继的账号 值唯一性 同一中继组内SIP账号强制唯一(通过数组值隐式保证) O(1)快速检索 通过isset($existingAccounts[$trunkIdx])可瞬间判断中继是否存在 O(n)成员检查 通过in_array($account, $existingAccounts[$trunkIdx])检查账号重复性

in_array解析:

$needle:要搜索的值(示例中的 SIP 账号)$haystack:被搜索的数组(示例中的 $existingAccounts[$trunkIdx])bool in_array(mixed $needle, array $haystack [, bool $strict = false])

code

1 基础功能:账号添加

// 检查中继组是否存在if (!isset($existingAccounts[$trunkIdx])) { // 新建中继分组(初始化空数组) $existingAccounts[$trunkIdx] = [];}// 添加账号到中继组$existingAccounts[$trunkIdx][] = $account;

2 去重高效性 ,添加新账号时,只需两步验证

$trunkIdx = \"2\"; // 目标中继$newAccount = \"1002\";if (isset($existingAccounts[$trunkIdx]) && in_array($newAccount, $existingAccounts[$trunkIdx])) { // 账号已存在 → 拒绝添加} else { // 安全添加账号}

3 函数封装

// 新增账号时防重复检查function addAccount($trunkIdx, $account) { global $existingAccounts; if (isset($existingAccounts[$trunkIdx]) { if (in_array($account, $existingAccounts[$trunkIdx])) { throw new Exception(\"账号 $account 已存在于中继 $trunkIdx\"); } } else { $existingAccounts[$trunkIdx] = []; // 初始化新中继组 } // 安全添加账号 $existingAccounts[$trunkIdx][] = $account;}// 示例:添加重复账号(触发异常)addAccount(\"2\", \"1001\"); // 抛出异常:账号1001已存在于中继2