按数组计数对数组进行分组

时间:2012-04-09 13:21:35

标签: php arrays sorting grouping

我有一系列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和这些内部如此排序......

2 个答案:

答案 0 :(得分:1)

您必须使用“自定义排序功能”:http://www.php.net/usort并编写用于自行排序的逻辑。

答案 1 :(得分: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;
}