Man könnte bei der Umwandlung von
$a
nach$a2
noch Teilmengen rausnehmen.$a = array( '62.120.0.0/8', '62.120.0.0/16' // <-- wird bereits durch Zeile darüber abgedeckt );
Genau das meinte ich mit präfixfreiem Code. Dieses Array kann bei korrekter Subnetzdefinition nicht entstehen, weil Du die IPv4 Welt nicht auf diese Weise aufteilen kannst. In welches Subnetz müsstest Du die Adresse 62.120.47.11 denn nun routen?
Das ist im Rahmen der Problemstellung, eine effiziente Lookup-Funktion zu schreiben, nicht so sehr von Bedeutung. Es lässt sich nun mal ohne weiteren Vorbau nicht verhindern, dass Anwender derlei Angaben für $a
übergeben. Die mögen inhaltlich zwar vielleicht wenig Sinn ergeben, aber sie sind im Sinne einfacher formaler Checks erst mal korrekt.
Wenn Du ein präfixfreies $a Array hast, kannst Du jeden Eintrag durch seine Basisadresse repräsentieren. Wenn du eine IP in $b dann der Reihe nach mit Subnetzmasken für die Präfixlängen von 1-32 maskierst und das Ergebnis in der Hashmap suchst, findest Du sie eindeutig.
Da kann ich noch immer nicht folgen. Wahrscheinlich verstehe ich es falsch. Ich schildere mal meinen Denkweg: Ich könnte in $a
eine Eingabe 192.168.0.0/24
haben. Die Subnetzmaske dazu wäre 255.255.255.0
. Wenn ich das mit 192.168.0.0
UND-verknüpfe, bleibe ich bei 192.168.0.0
als Eintrag in $a2
. Das wäre aber der gleiche Wert wie für 192.168.0.0/16
. Wenn ich in $b
dann eine IP 192.168.255.20
habe, würde mir die für 192.168.0.0/24
fälschlicherweise als Treffer in $a2
ausgewertet, obwohl sie nur für 192.168.0.0/16
ein Treffer wäre.