Array auslesen

Seit Tagen sitze ich vor diesem blöden Problem ein mehrdimensionals Array auszulesen und komme keinen Schritt weiter. Ich habe schon mehrfach Anwendungen dafür und kann keine umsetzen, weil ich an diesen blöden Array scheitere. Auch sämtliche Dokus machen mich nicht schlauer, ihr seid meine letzte Hoffnung:

Meine Array schaut so aus:

Array
(
    [0] => Array
        (
            [Duration] => 421691
            [LastTime] => 1359659630
            [TimeStamp] => 1359237940
            [Value] => 1
        )

    [1] => Array
        (
            [Duration] => 247
            [LastTime] => 1359237825
            [TimeStamp] => 1359237579
            [Value] => 1
        )

    [2] => Array
        (
            [Duration] => 873
            [LastTime] => 1359237451
            [TimeStamp] => 1359236579
            [Value] => 0
        )

    [3] => Array
        (
            [Duration] => 1858
            [LastTime] => 1359236212
            [TimeStamp] => 1359234355
            [Value] => 1
        )

Das geht so weiter bis zu den momentan vorhandenen 76 Einträgen und kommt aus einem Archive Händler. Was will ich erreichen? Ich will jedes Mal wenn der Wert Value 0 war, den Zeitstempel rausholen und so eine Liste in eine Variable schreiben, in der die Zeitstempel drin stehen, wenn halt jedes Mal 0 war…

Aber ich komme schon nicht an die Werte ran…brauche ich hier eine doppelte „for“ Schleife oder eine „foreach“ Schleife? Und wenn ja, wie code ich diese richtig?? Hilft mir jemand weiter :frowning:

Hallo,

eindimensionale Schleife mit Zähler reicht da aus. Der Ansatz sieht so aus ( Achtung! Ungetestet !) :
Dein Array habe ich „deinarray()“ genannt.


$liste=array();  // Deine zu generierende Liste 
$i=1; // Zähler für Deine Liste

FOR ($count=0; $count < count($deinarray); $count++)
	{
		IF ( $deinarray[$count] ['Value']==0 ) 
                     {
                          $liste[$i]=$deinarray[$count]['TimeStamp'];
                          $i++;
                     }
	}

$liste ist ein eindimensionales Array und enthält nun $i Elemente.

Gruß
Walter

oja, super, das funktioniert. Darauf wär ich selber nie gekommen. Ich verstehe zwar den Code jetzt wo ihn sehe, aber ihn selbst zu entwerfen fällt mir brutal schwer. Ich versuche jetzt mal selber das einfache Array weiterzuverarbeiten!

Dank dir! Unter Umständen könnt aber schon noch die eine oder andere Frage auftauchen :smiley:

Kein Problem. :stuck_out_tongue: Das mit den Arrays ist am Anfang nicht so einfach…

Das neue Array $liste beginnt mit Index 1. Das ist nicht ganz sauber. Setze $i am Anfang lieber auf 0, dann entspricht das dem üblichen Standard.

Gruß
Walter

Ich verstehe in IPS wirklich schon viel, aber mit den Arrays stehe ich immer wieder auf Kriegsfuß und habe viele Sachen deswegen schon nicht umsetzen können. Wenn ich die mal durchschaut hätte, könnte ich schon viel mehr basteln als bisher…mal sehen…danke, hab das mal auf 0 geändert.

So, ich habe es nun weit hingebracht, das ich aus dem eindimensionalen Array einen Wert in eine Variable schreibe, aber leider nur einen. Ich habe dafür die foreach Schleife benutzt, dacht das wär das Einfachste…falscher Ansatz? Das Script schaut so aus:

<?

$archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);

$array = AC_GetLoggedValues($archiveHandlerID, 25727 /*[Hardware Devices\W&T Keller\WuT Input 1\Kalkschutzanlage]*/, 1, time(), 0);

$liste=array();  // Deine zu generierende Liste
$i=0; // Zähler für Deine Liste

for ($count=0; $count < count($array); $count++)
    {
        IF ( $array[$count] ['Value']==0 )
                     {
                          $liste[$i]=$array[$count]['TimeStamp'];
                          $i++;
                          
                     }
    }


foreach ($liste as $stamps)
	
   			{
						$stamps = date('j.m.o h:i ',$stamps)."=> Störung/Salzmangel"."<br>";
				}



SetValueString(47105 /*[Test\Störungen Kalkschutzanlage]*/ , $stamps);

print_r($stamps);

?>

Die Ausgabe aber leider nur so:

20.02.2012 08:06 => Störung/Salzmangel

Da sollten aber eigentlich noch 10 andere Einträge stehen…

Hallo,

ja klar, $stamps enthält den letzten Wert aus der Schleife. $stamps ist eine ganz normale eindimensionale Variable und kann nur einen Wert annehmen, auch wenn Du in einer Schleife hinter einander 10 x einen anderen drüber schreibst.

Schreib doch mal genau, was Du erreichen willst. Der Ansatz aus einem 2-dimensionalen Array erst einmal ein eindimensionales mit Ergebnissen zu machen und dann weiterzuverarbeiten ist schon etwas merkwürdig. Vielleicht können wir Dir besser helfen, wenn wir Dein Ziel kennen.

Gruß
Walter

Das erklär ich doch gerne :slight_smile:

Ich möchte aus dem Archivehandler auslesen, wann der Wert „Value“ auf 0 war. Wenn das so war, möchte ich mir die Zeit dieses Events rausholen und in eine Variable schreiben, die dann im Webfront darstellbar ist. Es reicht mir eine Liste die 10 Zeilen lang ist. Den Zeitstempel in ein lesbares Format umwandeln hatte ich ja selbst schon fertig gebracht :wink:

Ganz oben hatte ich ja schon die Ausgabe des Arrays (nur den Anfang, ganzes Array hat 76 Einträge) aus dem Archivehandler angegeben…

So habe ich in einer Liste die letzten 10 Störeinträge meiner Entkalkungsanlage dargestellt, somit weiß ich, wann ich das letzte Mal Salz nachfüllen musste.

Ist klar was ich vor habe?

Ok, jetzetle :smiley:

 <?

$archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);
$liste="";
$array = AC_GetLoggedValues($archiveHandlerID, 25727 /*[Hardware Devices\W&T Keller\WuT Input 1\Kalkschutzanlage]*/, 1, time(), 0);


for ($count=0; $count < count($array); $count++)
    {
        IF ( $array[$count] ['Value']==0 )
                     {
                          $stamps=$array[$count]['TimeStamp'];
                          $liste.= date('j.m.o h:i ',$stamps)."=> Störung/Salzmangel
";
                          
                          
                     }
    }

SetValueString(47105 /*[Test\Störungen Kalkschutzanlage]*/ , $liste);

?> 

Achtung ! Variable 47105 muss vom Type String / Textbox sein. Anschließend im Webfront auf diese Variable verlinken.
$liste ist eine normale Stringvariable, die immer länger wird, aber die Ergebnisse mit einem Zeilenumbruch
voneinander trennt. Bei der Visualisierung hast Du dann mehrere Zeilen. Das müsste gehen…

Gruß
Walter

Vielen Dank, jetzt gehts, bis auf einen Schönheitsfehler:

Notice:  Array to string conversion in [Test\Archivetest] on line 14
Array29.10.2012 02:21 => Störung/Salzmangel
14.09.2012 07:59 => Störung/Salzmangel
20.08.2012 09:33 => Störung/Salzmangel
26.06.2012 03:08 => Störung/Salzmangel
26.06.2012 07:13 => Störung/Salzmangel
16.06.2012 01:34 => Störung/Salzmangel
28.04.2012 02:43 => Störung/Salzmangel
21.02.2012 09:58 => Störung/Salzmangel
21.02.2012 08:53 => Störung/Salzmangel
21.02.2012 07:20 => Störung/Salzmangel
20.02.2012 08:06 => Störung/Salzmangel


Warum muß eigentlich der Punkt hier hinter $liste??

$liste.= date('j.m.o h:i ',$stamps)."=> Störung/Salzmangel
";

edit: Ah, ich glaub ich habs gecheckt, damit wandelt man das Array in nen String um!

übrigens möchte ich die Liste dann zum Schluß auf 10 Einträge beschränken, aber das ist ein anderes Thema :rolleyes:

Nimm den mal raus

$liste=array();  // Deine zu generierende Liste 

Der gehört da nicht mehr hin. Auf 10 beschränken kriegst Du doch hin ?! Einfach oben in der IF-Klammerung einen Zähler mitlaufen lassen und abfragen :smiley:

Gruß
Walter

Jo, das wars…jetzt passt! Daaaanke!

Das mit dem Zähler probier ich gleich noch aus…

Auf sowas

$liste="";

wäre ich mein Leben nicht gekommen. Aber gut, ich verstehe es wenn ich es da so sehe. Meine Güte, ob ich das jemals selbstständig können werde? :frowning:

Nach einer Stunde suchen…ich scheitere auch am Zähler, ich glaube ich denke immer total in die verkehrte Richtung!

Welchen Wert nehme ich am besten her um zu zählen, da fängts schon an…

Versuch das hier :

 <?
$z=0;
$archiveHandlerID = IPS_GetInstanceIDByName("Archive Handler", 0);
$liste="";
$array = AC_GetLoggedValues($archiveHandlerID, 25727 /*[Hardware Devices\W&T Keller\WuT Input 1\Kalkschutzanlage]*/, 1, time(), 0);


for ($count=0; $count < count($array); $count++)
    {
        IF ( $array[$count] ['Value']==0 )
                     {
                          IF ($z < 10 ) 
                          {
                               $z++;
                               $stamps=$array[$count]['TimeStamp'];
                               $liste.= date('j.m.o h:i ',$stamps)."=> Störung/Salzmangel
";
                          }
                          ELSE
                          {
                               $count=count($array);
                          }
                          
                          
                     }
    }

SetValueString(47105 /*[Test\Störungen Kalkschutzanlage]*/ , $liste);

?>

$z sorgt dafür, dass nur 10 Werte in Deine Variable geschrieben werden.

Gruß
Walter

Danke! Hat, natürlich, funktioniert…

Moin Moin,

ich möchte ein Array auslesen und schaffe es einfach nicht eine Rückmeldung zu erhalten. Das ist auch mein erster Berührungspunkt mit Arrays, habe mich schon mehrere Tage damit beschäftigt und bin auch der Meinung, dass dieses Thema mir hätte helfen müssen, stehe aber einfach auf dem Schlauch.

Ich möchte in meinem Sonos System die Radiosender und Playlisten in eine HTML Box schreiben. Wenn ich die ProfilAssoziationen abfrage erhalten ich schonmal folgendes Array:


Array
(
    [0] => Array
        (
            [ProfileName] => Radio.SONOS
            [ProfileType] => 1
            [Icon] => Speaker
            [Prefix] => 
            [Suffix] => 
            [MinValue] => 1
            [MaxValue] => 5
            [StepSize] => 0
            [Digits] => 0
            [Associations] => Array
                (
                    [0] => Array
                        (
                            [Value] => 1
                            [Name] => Das Inselradio Mallorca
                            [Icon] => 
                            [Color] => 5479905
                        )

                    [1] => Array
                        (
                            [Value] => 2
                            [Name] => N-JOY 94.9 (Top 40/Pop)
                            [Icon] => 
                            [Color] => 5479905
                        )

                    [2] => Array
                        (
                            [Value] => 3
                            [Name] => NDR 2 Schleswig-Holstein 98.3 (Adult Contemporary)
                            [Icon] => 
                            [Color] => 5479905
                        )

                    [3] => Array
                        (
                            [Value] => 4
                            [Name] => R.SH
                            [Icon] => 
                            [Color] => 5479905
                        )


Ich vermute mal, dass es sich hierbei um ein „verschachteltes“ Array handelt. Ich benötige ja nun die Informationen aus [Value] und [Name] .
Idealerweise erhalte ich in die HTML Box die Auflistung:

Value Name
1 Das Inselradio Mallorca
2 N-JOY 94.9 (Top 40/Pop)
3 NDR 2 Schleswig-Holstein 98.3 (Adult Contemporary)
4 R.SH

VG
jloose

Du willst also einfach das Variablenprofil auslesen und dann die Werte irgendwie verwenden um damit eine HTML Box zu setzten?


$radiostations_profile = IPS_GetVariableProfile ("Sonos.Radio");
$radiostation_associations = $radiostations_profile["Associations"];

 foreach ($radiostation_associations as $key => $station)
 {
	$position = $key+1;
	$stationname = $station["Name"];
	echo "Auf Position ".$position. " Radiosender ".$stationname."<br>
";
 }

Statt echo musst Du Dir dann eben Dein HTML in der Schleife zusammenbauen. Ich weis ja nicht was Du da genau machen willst.

Er braucht aber Value und nicht die Position, diese ist irrelevant :wink:
Michael

Keine Ahnung für was er Value braucht aber der ergibt sich ja aus key aber man kann Value ja auch direkt auslesen, in dem Fall Value ja aber nur


$position = $key+1;

also auch direkt in Korrelation.

Nein eben nicht. Value ist der Wert der Assoziation und nicht die Position der Assoziationen. Es kann auch sein, dass es Lücken bei den Values gibt und dann funktioniert das über die Position nicht.
Somit wäre das korrekt:
$stationvalue = $station[„Value“];
Michael