Tach!
Für die zweite würde ich ein Array mit Timestamps (die Uhrzeit als Strings geht ebenso) als Keys anlegen und mit einem Array als Wert, in dem die IP-Adressen zu diesem Zeitpunkt abgelegt sind.
Wär’s nicht besser andersrum? Die IP-Adressen als Keys mit einem Array von Timestamps/Strings als Wert:
$ipAddresses = array( '91.200.12.153' => [ '23.01.2018 08:00:47', ], '91.200.12.13' => [ '23.01.2018 08:00:47', '23.01.2018 08:01:13', '23.01.2018 08:01:14', '23.01.2018 08:05:34', '23.01.2018 08:05:39', ], '91.200.12.82' => [ '23.01.2018 08:01:12', '23.01.2018 08:03:47', '23.01.2018 08:05:37', ], );
Wenn du das so aufbaust, muss als Zwischenschritt immer die komplette Struktur in ein Array eingelesen werden. Benötigt wird aber für die beiden Aufgaben lediglich ein Zähler sowie die Einträge der jüngsten drei Sekunden.
Und für jede IP-Adresse prüfen, ob 3 (oder mehr) Timestamps innerhalb von 3 Sekunden liegen. Wozu es sicherlich ratsam ist, bei der Erzeugung des Arrays die Zeit-Strings in Timestamps umzuwandeln.
Eigentlich hatte ich gedacht, dass ein sortierbarer String reichen würde und man sich das Parsen sparen kann. Für die Sortierbarkeit hat aber das Datum das falsche Format. Außerdem muss man eine Sonderregel für den Vergleich beim Stundenwechsel berücksichtigt werden. Und dann waren da auch noch die gesetzlich verordneten Zeitzonenwechsel. Alles unschön, also doch lieber parsen und mit Unix-Timestamps arbeiten.
dedlfix.