6

我正在为工作构建一个自定义开关管理器,我当前的问题更多是美学问题,但我认为这是一次很好的学习体验。为了清楚起见,我在下面发布了数组:

Array
(
    [1] => FastEthernet0/1
    [10] => FastEthernet0/10
    [11] => FastEthernet0/11
    [12] => FastEthernet0/12
    [13] => FastEthernet0/13
    [14] => FastEthernet0/14
    [15] => FastEthernet0/15
    [16] => FastEthernet0/16
    [17] => FastEthernet0/17
    [18] => FastEthernet0/18
    [19] => FastEthernet0/19
    [2] => FastEthernet0/2
    [20] => FastEthernet0/20
    [21] => FastEthernet0/21
    [22] => FastEthernet0/22
    [23] => FastEthernet0/23
    [24] => FastEthernet0/24
    [3] => FastEthernet0/3
    [4] => FastEthernet0/4
    [5] => FastEthernet0/5
    [6] => FastEthernet0/6
    [7] => FastEthernet0/7
    [8] => FastEthernet0/8
    [9] => FastEthernet0/9
    [25] => Null0
)

在我们更大的交换机上,我asort($arr);用来让 GigabitEthernet1/1 在 2/1 之前出现,等等......

我的目标是对接口编号(“/”之后的部分)进行排序,以便 1/8 在 1/10 之前。

有人能指出我正确的方向吗,我想为结果而努力,但我对 PHP 不够熟悉,无法确切知道该去哪里。

注意:在较大的多模块交换机上,ID 不是按顺序排列的,因此对 $arr[key] 的排序将不起作用。

4

2 回答 2

4

您可以在使用 asort() 时使用该标志,如下所示。

asort($arr, SORT_NATURAL | SORT_FLAG_CASE);print_r($arr);

它将根据需要打印/排序数据。

于 2013-08-11T07:04:26.673 回答
2

SORT_NATURAL 和 SORT_FLAG_CASE 需要 v5.4+。

如果您使用的是旧版本的 PHP,您可以使用 uasort 和自定义比较回调函数来完成。

$interfaces = array(...);
$ifmaj = array();
$ifmin = array();
$if_cmp = function ($a, $b) {
    list($amaj,$amin) = split('/',$a);
    list($bmaj,$bmin) = split('/',$b);
    $maj = strcmp($amaj,$bmaj);
    if ($maj!=0) return $maj;
    //Assuming right side is an int
    return $amin-$bmin;
};
uasort($interfaces, $if_cmp);
于 2013-08-11T11:07:51.557 回答