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 が必要で、これらの中に IP を並べ替える...

4

2 に答える 2

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 に答える
1

「カスタム ソート機能」を使用する必要があります: http://www.php.net/usortを使用して、自分でソートするためのロジックを記述します。

于 2012-04-09T13:25:37.827 に答える