in mehrdimensionalen Array suchen und Wert zuordnen

Eine Farge an die PHP-Profis.

Ich lasse mir mit list_devices() die Unifi Geräte anzeigen. Es kommt wie folgt an:

Array
(
    [0] => stdClass Object
        (
            [site_id] => 1236464654465465465
            [assoc_time] => 1592916128
            [latest_assoc_time] => 1592989972
            [oui] => ABCTech
            [user_id] => 5d5464hr4641316464
            [_id] => 456464v654ferf3t6
            [mac] => aa:bb:cc:dd:ee:ff
            [is_guest] => 
            [first_seen] => 1514549596
            [last_seen] => 1593156786
            [is_wired] => 
            [hostname] => max-muster
            [fixed_ip] => 192.168.1.10
            [name] => Max Mustermann
            [network_id] => 5wf6sdf14164wegrge6g46
            [note] => 
            [use_fixedip] => 
            [usergroup_id] => 
            [noted] => 1
            [_uptime_by_uap] => 166816
            [_last_seen_by_uap] => 1593156786
            [_is_guest_by_uap] => 
            [ap_mac] => 11:12:13:14:15:16
            [channel] => 6
            [radio] => ng
            [radio_name] => wifi1
            [essid] => WLANSSID
            [bssid] => 11:12:13:14:15:16
            [powersave_enabled] => 
            [is_11r] => 
            [ccq] => 30
            [rssi] => 55
            [noise] => -89
            [signal] => -34
            [tx_rate] => 72000
            [rx_rate] => 72000
            [tx_power] => 34
            [idletime] => 5
            [ip] => 192.168.1.100
            [dhcpend_time] => 1070
            [satisfaction] => 99
            [anomalies] => 0
            [vlan] => 0
            [radio_proto] => ng
            [uptime] => 240658
            [tx_bytes] => 28980705
            [rx_bytes] => 98468022
            [tx_packets] => 183062
            [tx_retries] => 40521
            [wifi_tx_attempts] => 223618
            [rx_packets] => 342159
            [bytes-r] => 716
            [tx_bytes-r] => 306
            [rx_bytes-r] => 410
            [qos_policy_applied] => 1
            [roam_count] => 1
        )

    [1] => stdClass Object
        (
            usw.

Ich möchte folgendes erreichen.

  • Suche nach einen Namen z.B. in [name] -> z.B. Max Mustermann
  • Schreiben der zugehörigen [ap_mac] -> z.B. 11:12:13:14:15:16 in eine Variable
  • Zuordnung dieser Variable zur einen bestimmten Bereich
    -> Ergebnis Max Mustermann ist am AB (11:12:13:14:15:16) angemeldet und befindet sich damit im Außenbereich

Könnte mir hier bitte jemand behilflich sein?

LG
Tom

Ohne den gesamten Array zu sehen aber hier mal ein Beispiel von einem simplen mehrdimmensionalen Array.


 $data = [
            [ 'ID' => 2, 'name' => 'lol', 'OnOffID' => '31578' ],
            [ 'ID' => 5, 'name' => 'lol2', 'OnOffID' => '31579' ],
        ];
		
	//$search = 	31578;
	$search = 	31579;
	
 $key = array_search($search, array_column($data, 'OnOffID'));
 var_dump($key);

Du durchsucht den Array auf das gewünschte Suchmuster $search, bei Dir eben Max Mustermann, und bekommst dann als Antwort den Key des Arrays. Wenn Du den Key kennst kannst Du das dann ganz normal auslesen


$name = $data[$key]['name'];

Hallo Fonzo,

damit hatte ich es auch schon versucht. Hatte ich in einem anderen Beitrag von Dir schon so gefunden. Nur leider tut es nicht. Ich erhalte immer bool(false). Egal was ich bei $search angebe.

Ich habe so einiges an Seiten dazu gelesen, bin aber nicht schlauer… eventuell weil das nach [0] => stdClass Object kein Array sondern ein Objekt ist… Leider fehlt mir dazu das Wissen.

Tom

Du must Dir Daten als Array holen nicht als Standardobject.
Im Zweifelsfall packst und entpackst Du die Daten halt noch mal, das Du auch ein Array hast.


$data_json = json_encode($data);
$data = json_decode($data_json, true);

Bei mir funktioniert das zumindest, kann aber sein das ich nicht genau verstanden habe was Du genau machen willst


  $data = [
            [ 'name' => 'Max Mustermann', 'ap_mac' => '11:12:13:14:15:16' ],
            [ 'name' => 'Susi Strolch', 'ap_mac' => '15:12:13:14:15:18' ],
        ];


	$search = 	'Max Mustermann';
    // $search = 	'Susi Strolch';

// search Key	
 $key = array_search($search, array_column($data, 'name'));
 var_dump($key);

// get name
$name = $data[$key]['name'];

// get MAC
$mac = $data[$key]['ap_mac'];

echo "Der Nutzer " . $name . " hat die MAC " . $mac;


Ich bekomme bei Deinem Beispiel als Ausgabe immer die Daten auf dem Array [0]. Egal was ich bei $search angebe.

Die Struktur sieht ja so aus:

Array
(
    [0] => stdClass Object
        (
            [site_id] => ...
            .....
            .....
        )

    [1] => stdClass Object
        (
            [site_id] => ...
            .....
            .....
        )

    [2] => stdClass Object
        (
            [site_id] => ...
            .....
            .....

usw      

Tom

Folgender Versuch:

$data_json = json_encode($unifi_connection->list_clients());
$data = json_decode($data_json, true); 

$search = "Mustermann-Smartphone";

// search Key    
 $key = array_search($search, array_column($data, 'name'));
 var_dump($key);

// get name
$name = $data[$key]['name'];

// get MAC
$mac = $data[$key]['ap_mac'];

echo "Der Nutzer " . $name . " hat die MAC " . $mac; 

Ergibt mal:

int(9)

Notice:  Undefined index: name in C:\ProgramData\Symcon\scripts\14978.ips.php on line 61
Der Nutzer  hat die MAC xx:xx:xx:xx:xx:xx

Und mal:

int(10)

Notice:  Undefined index: name in C:\ProgramData\Symcon\scripts\14978.ips.php on line 61

Notice:  Undefined index: ap_mac in C:\ProgramData\Symcon\scripts\14978.ips.php on line 64
Der Nutzer  hat die MAC 

Line 61 ist:
$name = $data[$key][‚name‘];

Line 64 ist:
$mac = $data[$key][‚ap_mac‘];

Tom

Das ist so heiteres Rätselraten. Wenn mach mal ein


 var_export($unifi_connection->list_clients()); 

damit man sieht wie das genau aussieht. Und des weiteren ist immer noch unklar nach was Du jetzt genau suchen willst nach dem Namen oder der Site ID oder nach was?

Sieht so aus:

array (
  0 => 
  (object) array(
     'site_id' => '846efewff464564564g34g3g46',
     'assoc_time' => 1592916128,
     'latest_assoc_time' => 1592989973,
     'oui' => 'ABCDE',
     'user_id' => '4ewf46v4v465g46g46g464',
     '_id' => '4ewf46v4v465g46g46g464',
     'mac' => 'a1:b1:e1:f1:g1:h1',
     'is_guest' => false,
     'first_seen' => 1514549596,
     'last_seen' => 1593191001,
     'is_wired' => false,
     'hostname' => 'Max-Muster',
     'fixed_ip' => '192.168.100.202',
     'name' => 'Mustermann-Smartphone',
     'network_id' => '5ferff54f6eqff46ff4rqf465',
     'note' => '',
     'use_fixedip' => false,
     'usergroup_id' => '',
     'noted' => true,
     '_uptime_by_uap' => 201032,
     '_last_seen_by_uap' => 1593191001,
     '_is_guest_by_uap' => false,
     'ap_mac' => '1a:2a:3a:4a:5a:6a',
     'channel' => 6,
     'radio' => 'ng',
     'radio_name' => 'wifi1',
     'essid' => 'WLAN',
     'bssid' => 'f1:f2:f3:f4:f5:f6',
     'powersave_enabled' => false,
     'is_11r' => false,
     'ccq' => 30,
     'rssi' => 51,
     'noise' => -90,
     'signal' => -39,
     'tx_rate' => 72000,
     'rx_rate' => 72000,
     'tx_power' => 34,
     'idletime' => 1,
     'ip' => '192.168.1.2',
     'dhcpend_time' => 1070,
     'satisfaction' => 99,
     'anomalies' => 0,
     'vlan' => 0,
     'radio_proto' => 'ng',
     'uptime' => 274873,
     'tx_bytes' => 32694935,
     'rx_bytes' => 109810651,
     'tx_packets' => 206922,
     'tx_retries' => 41312,
     'wifi_tx_attempts' => 248268,
     'rx_packets' => 383898,
     'bytes-r' => 480,
     'tx_bytes-r' => 5,
     'rx_bytes-r' => 474,
     'qos_policy_applied' => true,
     'roam_count' => 1,
  ),
  1 => 
  (object) array(
     'site_id' => 'fe3fefg465f4f64f64234',
     'assoc_time' => 1593154776,
     'latest_assoc_time' => 1593154778,
     'oui' => 'Apple',
     'user_id' => '5egerg4w56g4g4w464w6gwg',
     '_id' => '5egerg4w56g4g4w464w6gwg',
     'mac' => 'aa:bb:cc:dd:ee:ff',
     'is_guest' => false,
     'first_seen' => 1555521225,
     'last_seen' => 1593191013,
     'is_wired' => false,
     'hostname' => 'iPad',
     'network_id' => '4dwfd4w6f4gf4g4g446446',
     'usergroup_id' => '',
     'note' => '',
     'name' => 'Mustermann-iPad',
     'fixed_ip' => '192.168.1.9',
     'use_fixedip' => false,
     'noted' => true,
     '_uptime_by_uap' => 36236,
     '_last_seen_by_uap' => 1593191013,
     '_is_guest_by_uap' => false,
     'ap_mac' => 'e1:e2:e3:e4:e5:e6',
     'channel' => 36,
     'radio' => 'na',
     'radio_name' => 'wifi1',
     'essid' => 'WALN',
     'bssid' => '11:22:33:44:55:66',
     'powersave_enabled' => false,
     'is_11r' => false,
     'ccq' => 333,
     'rssi' => 32,
     'noise' => -101,
     'signal' => -64,
     'tx_rate' => 866700,
     'rx_rate' => 866700,
     'tx_power' => 32,
     'idletime' => 0,
     'ip' => '192.168.100.4',
     'dhcpend_time' => 369290,
     'satisfaction' => 100,
     'anomalies' => 0,
     'vlan' => 0,
     'radio_proto' => 'ac',
     'uptime' => 36237,
     'tx_bytes' => 15215450028,
     'rx_bytes' => 141743905,
     'tx_packets' => 10255791,
     'tx_retries' => 754667,
     'wifi_tx_attempts' => 6280910,
     'rx_packets' => 1866967,
     'bytes-r' => 624163,
     'tx_bytes-r' => 619719,
     'rx_bytes-r' => 4443,
     'qos_policy_applied' => true,
  ),
  2 => 
  usw.

Da habe ich mich bestimmt oben nicht ganz verständlich ausgedrückt:

Ich möchte:

  • suchen bei in welchem Bereich unter ‚name‘ -> „Mustermann-Smartphone“ steht
  • herausfinden welche Mac-Adresse dann in diesem Bereich in ‚ap_mac‘ steht
  • anhand einer Liste möchte ich dann diese Mac-Adresse vergleichen und zu einen Aufenhaltsbereich zuordnen

Ergebnis sollte sein:
Der AP an dem Mustermann-Smartphone angemeldet ist hat die MAC-Adresse X, und diese gehört z.B. zum Bereich "Außengelände. -> Max Mustermann ist im Außengelände

Tom

Also bei mir kommt da keine Fehlermeldung


$data = array (
  0 => 
  (object) array(
     'site_id' => '846efewff464564564g34g3g46',
     'assoc_time' => 1592916128,
     'latest_assoc_time' => 1592989973,
     'oui' => 'ABCDE',
     'user_id' => '4ewf46v4v465g46g46g464',
     '_id' => '4ewf46v4v465g46g46g464',
     'mac' => 'a1:b1:e1:f1:g1:h1',
     'is_guest' => false,
     'first_seen' => 1514549596,
     'last_seen' => 1593191001,
     'is_wired' => false,
     'hostname' => 'Max-Muster',
     'fixed_ip' => '192.168.100.202',
     'name' => 'Mustermann-Smartphone',
     'network_id' => '5ferff54f6eqff46ff4rqf465',
     'note' => '',
     'use_fixedip' => false,
     'usergroup_id' => '',
     'noted' => true,
     '_uptime_by_uap' => 201032,
     '_last_seen_by_uap' => 1593191001,
     '_is_guest_by_uap' => false,
     'ap_mac' => '1a:2a:3a:4a:5a:6a',
     'channel' => 6,
     'radio' => 'ng',
     'radio_name' => 'wifi1',
     'essid' => 'WLAN',
     'bssid' => 'f1:f2:f3:f4:f5:f6',
     'powersave_enabled' => false,
     'is_11r' => false,
     'ccq' => 30,
     'rssi' => 51,
     'noise' => -90,
     'signal' => -39,
     'tx_rate' => 72000,
     'rx_rate' => 72000,
     'tx_power' => 34,
     'idletime' => 1,
     'ip' => '192.168.1.2',
     'dhcpend_time' => 1070,
     'satisfaction' => 99,
     'anomalies' => 0,
     'vlan' => 0,
     'radio_proto' => 'ng',
     'uptime' => 274873,
     'tx_bytes' => 32694935,
     'rx_bytes' => 109810651,
     'tx_packets' => 206922,
     'tx_retries' => 41312,
     'wifi_tx_attempts' => 248268,
     'rx_packets' => 383898,
     'bytes-r' => 480,
     'tx_bytes-r' => 5,
     'rx_bytes-r' => 474,
     'qos_policy_applied' => true,
     'roam_count' => 1,
  ),
  1 => 
  (object) array(
     'site_id' => 'fe3fefg465f4f64f64234',
     'assoc_time' => 1593154776,
     'latest_assoc_time' => 1593154778,
     'oui' => 'Apple',
     'user_id' => '5egerg4w56g4g4w464w6gwg',
     '_id' => '5egerg4w56g4g4w464w6gwg',
     'mac' => 'aa:bb:cc:dd:ee:ff',
     'is_guest' => false,
     'first_seen' => 1555521225,
     'last_seen' => 1593191013,
     'is_wired' => false,
     'hostname' => 'iPad',
     'network_id' => '4dwfd4w6f4gf4g4g446446',
     'usergroup_id' => '',
     'note' => '',
     'name' => 'Mustermann-iPad',
     'fixed_ip' => '192.168.1.9',
     'use_fixedip' => false,
     'noted' => true,
     '_uptime_by_uap' => 36236,
     '_last_seen_by_uap' => 1593191013,
     '_is_guest_by_uap' => false,
     'ap_mac' => 'e1:e2:e3:e4:e5:e6',
     'channel' => 36,
     'radio' => 'na',
     'radio_name' => 'wifi1',
     'essid' => 'WALN',
     'bssid' => '11:22:33:44:55:66',
     'powersave_enabled' => false,
     'is_11r' => false,
     'ccq' => 333,
     'rssi' => 32,
     'noise' => -101,
     'signal' => -64,
     'tx_rate' => 866700,
     'rx_rate' => 866700,
     'tx_power' => 32,
     'idletime' => 0,
     'ip' => '192.168.100.4',
     'dhcpend_time' => 369290,
     'satisfaction' => 100,
     'anomalies' => 0,
     'vlan' => 0,
     'radio_proto' => 'ac',
     'uptime' => 36237,
     'tx_bytes' => 15215450028,
     'rx_bytes' => 141743905,
     'tx_packets' => 10255791,
     'tx_retries' => 754667,
     'wifi_tx_attempts' => 6280910,
     'rx_packets' => 1866967,
     'bytes-r' => 624163,
     'tx_bytes-r' => 619719,
     'rx_bytes-r' => 4443,
     'qos_policy_applied' => true,
  )
);

$data_json = json_encode($data);
$data = json_decode($data_json, true);
var_dump($data);

	$search = 	'Mustermann-Smartphone';
    

// search Key	
 $key = array_search($search, array_column($data, 'name'));
 // var_dump($key);

// get name
$name = $data[$key]['name'];

// get MAC
$mac = $data[$key]['ap_mac'];

 echo "Der Nutzer " . $name . " hat die MAC " . $mac;

ergibt


Der Nutzer Mustermann-Smartphone hat die MAC 1a:2a:3a:4a:5a:6a

Bei mir geht das mit diesem Beispiel auch.

Ich habe folgendes gefunden;
Leider ist in der gesamten Ausgabe „list_clients())“ in manchen Sub-Arrays ‚name‘ oder/und ‚ap_mac‘ nicht enthalten, das sind z.B. Geräte am Switch, diese bringen dann die Fehlermeldung. „Undefined index: ap_mac in C:\ProgramData\Symcon\scripts\14978.ips.php on line 54“. Die Suche bleibt dann an dieser Stelle stehen. Kann man das umgehen?

Ist der Suchbegriff in der Liste nicht vorhanden werden immer die Daten von „0 => (object) array“ ausgegeben, lässt sich das umgehen?

Lieben Dank für Deine Hilfe!

Tom

Dann kannst Du auch nicht über den Array suchen wenn Du keine Gewissheit hast, dass dieser Key überhaupt existiert, dann musst Du wohl oder übel über den Array iterieren.


$data_json = json_encode($data);
$data = json_decode($data_json, true);

$search = 	'Mustermann-Smartphone';


foreach($data as $key => $device)
{
    if(isset($device['name']) && isset($device['ap_mac']))
    {
        // get name
        $name = $device['name'];

        // get MAC
        $mac = $device['ap_mac'];
        if($name == $search)
        {
            echo "Der Nutzer " . $name . " hat die MAC " . $mac;
        }
    }
}

Genau das ist es. Geht wie gewünscht. Vielen Dank für Deine Hilfe!

Tom