0

我有一系列 IP 网络

<?php
$array = array(
    '217.192' => array(
        array(
            'ip' => '217.192.133.52',
            'id' => '1',
        ),
        array(
            'ip' => '217.192.98.111',
            'id' => '2',
        ),
    ),
    '21.170' => array(
        array(
            'ip' => '21.170.171.23',
            'id' => '3',
        ),
        array(
            'ip' => '21.170.212.22',
            'id' => '4',
        ),
    ),
    '148.11' => array(
        array(
            'ip' => '148.11.11.12',
            'id' => '5',
        ),
        array(
            'ip' => '148.11.122.33',
            'id' => '6',
        ),
        array(
            'ip' => '148.11.22.89',
            'id' => '7',
        ),
    ),
    '72.1' => array(
        array(
            'ip' => '72.1.98.9',
            'id' => '8',
        ),
    ),
);

我需要按计数输出这个数组排序并按子网排序(数组的键)。

arsort($array)不像我想要的那样工作。

我需要 148.11, 21.170, 217.192, 72.1 AND 在这些内部,所以对 ips 进行排序...

4

2 回答 2

1

您将不得不使用“自定义排序功能”:http ://www.php.net/usort并编写自己的排序逻辑。

于 2012-04-09T13:25:37.827 回答
1

试试这个:

function sortHelper(array $a, array $b) {
    $aCnt = count($a);
    $bCnt = count($b);
    if ($aCnt == $bCnt) {
        return 0;
    } else if ($aCnt > $bCnt) {
        return -1;
    } else {
        return 1;
    }
}

uasort($array, 'sortHelper');

// UPDATE: sort inside by IP

function ipSortHelper(array $a, $b) {
    $aIp = ip2long($a['ip']);
    $bIp = ip2long($b['ip']);
    if ($aIp == $bIp) {
        return 0;
    } else if ($aIp < $bIp) {
        return -1;
    } else {
        return 1;
    }
}

foreach ($array as $prefix => $group) {
    uasort($group, 'ipSortHelper');
    $array[$prefix] = $group;
}
于 2012-04-09T13:29:18.290 回答