这个问题是关于如何最好地对多维数组进行排序。
让我们开始说我使用mysqli_fetch_array()的结果填充$ result。
$ result的每一行都是一个包含IP地址,主机名等内容的数组。但对于这个问题,只需假装每行只包含键'ip'和'hostname'。
我希望能够以三种方式对结果进行排序(由用户偏好决定):
1)通过IP地址(简单 - 已经完成)
2)通过主机名(简单 - 已经完成)
3)组合(我的意思是:只要默认主机名没有用于特定设备,按主机名排序,在这种情况下,该行应该根据数据重新排列在数组中IP地址)。
我写了这段代码:
// sort the devices in the table according to user preference
if ($sorting == 'ip') {
// sort by IP address
usort($result, function ($a, $b) {
return ip2long($a['ip']) - ip2long($b['ip']);
});
}
elseif ($sorting == 'hostname') {
// sort by hostname
usort($result, function ($a, $b) {
return strnatcasecmp($a['hostname'], $b['hostname']);
});
}
elseif ($sorting == 'combined') {
// sort by hostname except when the default hostname is found (sort by IP in that case)
usort($result, function ($a, $b) {
if ($a['hostname'] != 'default' && $b['hostname'] != 'default') {
return strnatcasecmp($a['hostname'], $b['hostname']);
}
else {
return ip2long($a['ip']) - ip2long($b['ip']);
}
});
}
代码有效,或者更确切地说它会产生我期望的结果。但是,我担心我用于'合并'的功能是否安全。
我具体指的是如何在引擎盖下工作。我在这里找到了一些实现细节:https://stackoverflow.com/a/46281305/6583579
我没有进行过非常广泛的测试(我认为很难测试比较器可能运行的所有可能方式)。所以我只是想避免可能的陷阱。
如果您想知道为什么我需要'组合',并且听起来很复杂,这是实验室使用的自动化/编排工具的一部分。设备可能仍未取消配置。在这种情况下,它最好与该范围内的其他IP地址相邻。它很容易被发现,并且很容易推断它应该如何配置。或者以这种方式看待它,默认的主机名并不是真正有意义的,并且对它进行排序没有多大意义。
非常感谢提前。