PHP:我的比较函数是否可以安全地用于usort?

时间:2018-06-12 03:41:50

标签: php arrays sorting

这个问题是关于如何最好地对多维数组进行排序。

让我们开始说我使用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地址相邻。它很容易被发现,并且很容易推断它应该如何配置。或者以这种方式看待它,默认的主机名并不是真正有意义的,并且对它进行排序没有多大意义。

非常感谢提前。

0 个答案:

没有答案