Danke für die Antwort.
Du brauchst in $new kein 2D-Array, die Subnetze bilden per Definition einen präfixfreien Code. Die errechneten $iplong-Werte in f dürften bei realitätsnahen Inhalten im $a Array keine Doubletten bilden. Es sei denn, du hantierst mit historischen Daten und hast Subnetzangaben, die später aufgeteilt wurden.
Das verstehe ich leider nicht. Ich speichere die Bitlänge mit, weil ich meines Erachtens sonst nicht wissen kann, auf wie viele Stellen ich eine zu prüfende IP aus $b
testen muss. Also, um etwa zwischen 192.168.0.0/16
und 192.168.0.0/24
unterscheiden zu können. Das war zumindest mein Gedanke dazu.
Du solltest auch den ip2long Wert [nicht] nach rechts shiften, sondern aus der Präfixlänge die Subnetzmaske bestimmen (über eine Lookup-Tabelle) und dann $iplong & $subnetmask als Key für $a2 verwenden. Dann kannst Du in g nämlich über alle 31 möglichen Subnetzmasken gehen und mit array_key_exists in $a2 prüfen, ob $b & $subnetmask enthalten ist. Bei vielen Einträgen in $a ist das effizienter.
Das könnte sinnvoll sein. Werde ich umstellen.
Eine weitere Optimierung wäre, in $a die tatsächlich genutzten Subnetzmasken als Keys eines Arrays zu sammeln und in g nur diese für die Suche zu nutzen.
Ja, das habe ich in meiner lokalen Version bereits drin.
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
);