*/ public const BEOBACHTUNGEN = [ 31, 41, 42, 43, 47, 48, 62, 96, 100, 102, 104, 109, 110, 111, 112, 113, 114, 119, 120, 182, 183, 184, 185, 250, ]; public static function seriennummer(string $wert): string { return strtoupper(trim($wert)); } /** * @param mixed $knoten * @param list $abonnements * @return list */ public static function extrahiereBeobachtungen( $knoten, array $abonnements, string $seriennummer = '', int $tiefe = 0 ): array { if (!is_array($knoten) || $tiefe > 12) { return []; } $abonnements = array_values(array_unique(array_map( [self::class, 'seriennummer'], $abonnements ))); foreach (['serialNumber', 'SerialNumber', 'chargerId', 'ChargerId', 'mid', 'Mid'] as $feld) { if (!isset($knoten[$feld]) || !is_scalar($knoten[$feld])) { continue; } $kandidat = self::seriennummer((string) $knoten[$feld]); if (in_array($kandidat, $abonnements, true)) { $seriennummer = $kandidat; break; } } if (self::istListe($knoten)) { foreach ($knoten as $wert) { if (!is_string($wert)) { continue; } $kandidat = self::seriennummer($wert); if (in_array($kandidat, $abonnements, true)) { $seriennummer = $kandidat; } } } $id = null; foreach (['id', 'Id', 'observationId', 'ObservationId'] as $feld) { if (array_key_exists($feld, $knoten) && is_numeric($knoten[$feld])) { $id = (int) $knoten[$feld]; break; } } $wertVorhanden = false; $wert = null; foreach (['value', 'Value'] as $feld) { if (array_key_exists($feld, $knoten)) { $wertVorhanden = true; $wert = $knoten[$feld]; break; } } $ergebnis = []; if ( $seriennummer !== '' && $wertVorhanden && in_array($id, self::BEOBACHTUNGEN, true) ) { $ergebnis[] = [ 'Seriennummer' => $seriennummer, 'ID' => $id, 'Wert' => $wert, ]; } foreach ($knoten as $kind) { if (is_array($kind)) { $ergebnis = array_merge( $ergebnis, self::extrahiereBeobachtungen( $kind, $abonnements, $seriennummer, $tiefe + 1 ) ); } } return $ergebnis; } /** @param array $wert */ private static function istListe(array $wert): bool { $index = 0; foreach ($wert as $schluessel => $_) { if ($schluessel !== $index++) { return false; } } return true; } }