Как максимально перемешать строки?

Здравствуйте. Имеется файл с ip адресами https://pastebin.com/54maYsLe Как с помощью php скрипта максимально перемешать данные строки? Используя сервисы по перемешиванию или excel невозможно добиться максимально разных значений строк. Получается что-то вроде этого:

f465e6ab0226475c99169881a85b36a1.png

Как добиться максимально разных строк?
  • Вопрос задан
  • 345 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Каждый 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
) */
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега PHP
Web developer
Ответ написан
Комментировать
@kstyle
только вручную программировать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽