Nested Array - Wert ausgeben/suchen

Ich habe mich seit einiger Zeit gewundert, warum der Text aus einem Profil nicht richtig angezeigt wird.

Folgender Code bekommt einen Wert übergeben, bis 12 funktioniert das, darüber nicht mehr. Warum ist mit vorhin aufgefallen.


$code = $_IPS['VALUE'];
$name = IPS_GetVariableProfile("Status.WRX")['Associations'][$code]['Name'];
SetStatusMeldungen(StatusGartenRobi, "GartenRobi, Status ".$code, $name);

Ich bekomme Value und nicht die ID vom Array :eek:.



Notice:  Undefined offset: 30 in /var/lib/symcon/scripts/37360.ips.php on line 12
--
(
    [ProfileName] => Status.WRX
    [ProfileType] => 1
    [Icon] => 
    [Prefix] => 
    [Suffix] => 
    [MinValue] => 0
    [MaxValue] => 0
    [StepSize] => 0
    [Digits] => 0
    [Associations] => Array
        (
            [0] => Array
                (
                    [Value] => 0
                    [Name] => Pause
                    [Icon] => 
                    [Color] => -1
                )

[...]
            [12] => Array
                (
                    [Value] => 12
                    [Name] => Fernsteuerung
                    [Icon] => 
                    [Color] => -1
                )

            [13] => Array
                (
                    [Value] => 30
                    [Name] => Rückfahrt
                    [Icon] => 
                    [Color] => -1
                )

            [14] => Array
                (
                    [Value] => 31
                    [Name] => Zonentraining
                    [Icon] => 
                    [Color] => -1
                )

            [15] => Array
                (
                    [Value] => 32
                    [Name] => Kantenschnitt
                    [Icon] => 
                    [Color] => -1
                )

            [16] => Array
                (
                    [Value] => 33
                    [Name] => fährt Zone an
                    [Icon] => 
                    [Color] => -1
                )

            [17] => Array
                (
                    [Value] => 34
                    [Name] => Pause
                    [Icon] => 
                    [Color] => -1
                )

        )

    [IsReadOnly] => 
)

Und da es Lücken gibt, stimmen die Array-ID und Value leider nicht überein.

Alle meine bisherigen Versuche klappen nicht, mit array_search, Funktionen zum SUchen in nested Arrays, …

Wie komme ich an Name von Values größer 12?

Einfach (wenn auch nicht elegant)
Mit foreach das Array durchlaufen und ‚Value‘ auf $_IPS[‚VALUE‘] prüfen.
Michael

jupp, so ist die Lösung, nicht hübsch, aber ausreichend :smiley:

Falls mal jemand etwas ähnliches sucht, hier „meine“ Funktion:


function search($array, $key, $value)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key, $value));
        }
    }

    return $results;
}

$array = IPS_GetVariableProfile("Status.WRX");
echo search($array, 'Value', $wert)[0]['Name'] ;

Vielleicht noch eine kurze Erklärung, die Funktion sucht im übergebenen Array (1. Parameter), in dem Key (2. Parameter), den Inhalt (3. Parameter).

Es kommt ein Array zurück ([0]), in dem es auch das Feld Name gibt, das ich dann direkt verwende. Wegen Platz sparen alles in einer Zeile :D.

Ich hatte eher an so etwas gedacht (nicht getestet, nur eingetippt)

$code = $_IPS['VALUE'];
$Associations = IPS_GetVariableProfile("Status.WRX")['Associations'];
foreach ($Associations as $Index => $Association){
    if ($Association['Value'] == $code){
        break;
    }
}
$name = $Associations[$Index]['Name'];
SetStatusMeldungen(StatusGartenRobi, "GartenRobi, Status ".$code, $name);  

Michael

Ergänzend, wenn die Variable welche dieses Script startet dieses Profil benutzt, geht auch GetValueFormatted($_IPS[‚VARIABLE‘])
Michael

Michael hat natürlich wie immer Recht, das ist cool und deutlich einfacher wie wilde Sucherei :loveips:.