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