Spontane Idee: So ein Array…
$a = array(
'192.168.11.12/24',
'62.10.11.12/32',
'128.10.11.12/8',
'96.50.51.52/16'
);
…in diese Form überführen…
$a2 = array(
'192.168.11' => true,
'62.10.11.12' => true,
'128' => true,
'96.50' => true
};
…und dann für jeden Eintrag aus $b
in der Form w.x.y.z
prüfen, ob w
, w.x
, w.x.y
oder w.x.y.z
als Index in $a2
existieren (isset
).
Mal zusammengehackt:
<?php
$a = array(
'192.168.11.12/24',
'62.10.11.12/32',
'128.10.11.12/8',
'96.50.51.52/16'
);
$b = array(
'192.168.128.0', // kein Treffer
'192.168.11.255', // Treffer
'62.10.11.255', // kein Treffer
'62.10.11.12', // Treffer
'128.255.255.255', // Treffer
'129.255.255.255', // kein Treffer
'96.50.255.255', // Treffer
'97.50.51.52' // kein Treffer
);
function f(array $a)
{
$new = array();
foreach ($a as $item) {
list($ipv4, $cidr) = explode('/', $item);
$index = implode('.', array_slice(explode('.', $ipv4), 0, $cidr >> 3));
$new[$index] = true;
}
return $new;
}
function g(array $a2, array $b)
{
foreach ($b as $item) {
$parts = explode('.', $item);
$tmp = '';
for ($i = 0; $i <= 3; $i++) {
$tmp .= (('' !== $tmp) ? '.' : '') . $parts[$i];
if (isset($a2[$tmp])) {
echo $item . '- Treffer' . "\n";
continue 2;
}
}
echo $item . ' - kein Treffer' . "\n";
}
}
$a2 = f($a);
g($a2, $b);
→ Demo