Каждый IP адрес это 32-битное целое.
Можно отсортировать по обратному порядку бит в числе – это здорово раскидает соседние адреса.
Понадобятся три функции:
function ip2n( $ip ) { // строку ip перевести в целое
$ipa = explode('.', $ip);
return $ipa[0]<<24 | $ipa[1] << 16 | $ipa[2] << 8 | $ipa[3];
}
function n2ip( $n ) { // целое перевести в строку ip
return implode('.', array(
$n >> 24 & 0xFF,
$n >> 16 & 0xFF,
$n >> 8 & 0xFF,
$n & 0xFF
));
}
function bitreverse( $n ) { // развернуть порядок бит в 32-битном целом
return bindec( strrev( sprintf( '%032b', $n)));
}
Теперь остаётся загрузить ваши ip в массив, и прогнать через ip2n, bitreverse, обычную сортировку целых по возрастанию, bitreverse и n2ip. Пример:
$ips = array(
'192.168.1.15',
'192.168.1.16',
'192.168.1.17',
'95.181.217.91',
'95.181.217.96',
'95.181.217.97',
'91.216.3.90',
'91.216.3.91',
'91.216.3.99',
'5.62.157.78',
'5.62.157.84',
'5.62.157.87',
);
$ips = array_map( 'ip2n', $ips);
$ips = array_map( 'bitreverse', $ips);
sort( $ips, SORT_NUMERIC);
$ips = array_map( 'bitreverse', $ips);
$ips = array_map( 'n2ip', $ips);
print_r($ips);
/* Array
(
[0] => 95.181.217.96
[1] => 192.168.1.16
[2] => 5.62.157.84
[3] => 91.216.3.90
[4] => 5.62.157.78
[5] => 95.181.217.97
[6] => 192.168.1.17
[7] => 91.216.3.99
[8] => 95.181.217.91
[9] => 91.216.3.91
[10] => 5.62.157.87
[11] => 192.168.1.15
) */