Объясните php скрипт?

Есть такой скрипт не могу понять что где за что отвечает
<?php
file_put_contents('output', join(PHP_EOL, array_map(function ($sInput) {
    list($ip, $mask) = explode('/', trim($sInput));
    return substr(str_pad(decbin(ip2long($ip)), 32, 0, STR_PAD_LEFT), 0, $mask);
    }, file('input', FILE_SKIP_EMPTY_LINES))));
?>

Он по идеи должен открывать файл где записано 800 ip адресов, читать построчно каждый адрес и преобразовывать его в двоичный код и записывать результат в другой файл. Этот скрип может это сделать или что то не то написано.?
  • Вопрос задан
  • 455 просмотров
Решения вопроса 3
orlov0562
@orlov0562 Куратор тега PHP
I'm cool!
тому кто это написал, стоит прострелить колено..

вот код с комментариями о происходящем
$inputArr = file('input', FILE_SKIP_EMPTY_LINES); // читаем из файла все данные
$outputArr = []; // пустой выходной массив

foreach ($inputArr as $line) { // читаем построчно входные данные
	list($ip, $mask) = explode('/', trim($line)); // разбиваем строку на $ip и $mask, по разделителю '/'
	$ipAsLongInt = ip2long($ip); // Преобразуем ip адрес в десятичное число
	$ipAsBinary = decbin($ipAsLongInt); // Преобразуем число в бинарное число
	$ipAsBinaryWithCorrectLength = str_pad($ipAsBinary, 32, 0, STR_PAD_LEFT); // дополняем слева нулями до длинны 32 символа
	$outputLine = substr($ipAsBinaryWithCorrectLength, 0, $mask); // Копируем из строки только первые $mask символов
	$outputArr[] = $outputLine;
}

$outputRaw = join(PHP_EOL, $outputArr); // Соединяем все строки из массива символом перевода строки
file_put_contents('output', $outputRaw); // Записываем данные в выходной файл


И ответ: да, этот код делает то, что надо
Ответ написан
Stalker_RED
@Stalker_RED
Да, по идее сможет.
если его разобрать на отдельные функции, получится как-то так:
$input_lines = file('input.txt', FILE_SKIP_EMPTY_LINES);
    $output_lines = [];
    foreach ($input_lines as $line) {
        $line = trim($line);
        list($ip, $mask) = explode('/', $line);
        $ip_as_long = ip2long($ip);
        $ip_as_bin = decbin($ip_as_long);
        $padded_bin = str_pad($ip_as_long, 32, 0, STR_PAD_LEFT);
        $output_lines[] = substr($padded_bin, 0, $mask);
    }
    $out = join(PHP_EOL, $output_lines);
    file_put_contents('output.txt', $out);

Если какие-то функции незнакомы - смотрите в документацию, там вверху поиск есть.
Ответ написан
Комментировать
@tplus
В файл "output" пишет:
1) строки из файла input, пропуская пустые, объединённые через PHP_EOL (конец строки => перевод на новую строку, из массива file('input', FILE_SKIP_EMPTY_LINES), к которому применяет функцию function ($sInput)
2) которая берёт строку и
2.1) в переменные $ip и $mask заносит значения, разделив строку на две от символа '/' + почистив её слева-справа от пробелов и т.п.
2.2) возвращает вырезанную подстроку из дополненной слева строки до 32 символов нулями str_pad(decbin(ip2long($ip)), 32, 0, STR_PAD_LEFT) в виде результат преобразования переменной $ip от нулевого символа до символа с индексом $mask

ip2long известная функция, гуглится в интернете: ip в число
decbin переводит в бинарный код
str_pad с параметрами как у вас делает строку вида 123 -> <29 нулей>123
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Maxsior
@Maxsior
loading...
Всё должно работать нормально.
Вот так читабельнее:
<?php
file_put_contents(
	'output', 
	join(
		PHP_EOL, 
		array_map(
			function ($sInput) {
				list($ip, $mask) = explode('/', trim($sInput));
				return substr(str_pad(decbin(ip2long($ip)), 32, 0, STR_PAD_LEFT), 0, $mask);
			}, 
			file('input', FILE_SKIP_EMPTY_LINES))
		)
	);
?>

Начну разбор с array_map:
Эта функция применяет другую функцию(тавтология, ну и пусть) к каждому элементу массива.
Т.е. скрипт считывает массив строк в фаиле input, и к каждои строке применяет анонимную функцию, которая определяет ip($ip) и маску($mask), потом вырезает(substring) сам ip переводит в двоичныи код и доводит длину строки до 32 символов(strpad), заполняя ведущими нулями.
После array_map получается массив из ip в двоичном виде.
Потом функциеи join(то же, что implode()) объединяет массив в строку, разделяя элементы переносов строки(константа PHP_EOL).
И пишет эту стоку в фаил output методом file_put_contents
Ответ написан
@RadialAdmin
Вы так и не узнали для чего вашему начальнику требуется перевести список IP в бинарный вид?
Может хватит изобретать велосипеды, спросите уже конечную задачу и сделайте её прощё, чем по странным шагам предложенным им.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы