Начальный адрес сети вычисляется путем установки всех битов хоста маски на ноль. Другими словами, это простое побитовое И адреса и маски.
Используйте inet_pton для анализа IP-адреса. В стандартной библиотеке нет функции, которая создает двоичные сетевые маски, поэтому вы должны написать ее самостоятельно:
<?php
function mask(int $bits, int $ones): string
{
$m = "";
for ($i = 0; $i < $bits/8; $i++) {
if ($ones >= 8) {
$m .= chr(0xff);
$ones -= 8;
} else {
$m .= chr(~(0xff >> $ones));
$ones = 0;
}
}
return $m;
}
$addr = inet_pton("d7a:5949:11d0:bd9e:b2c1:6268:d889:de9b");
$mask = mask(128, 48);
$start = $addr & $mask;
echo inet_ntop($start), "\n"; // d7a:5949:11d0::
Попробуйте на 3v4l.org: https://3v4l.org/hrD6a