assoziativen array

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich habe ein kleines Problem mit assoziativen array.

    Bislang bin ich nicht auf die Lösung gekommen. Irgendwie drehe ich mich im Kreis herrum.

    Kurz um was es sich handelt:

    Ich lese die aktuellen Zustände von Funksteckdosen aus und Speicher die in einer Datei "Steckdose.dat" ab.

    Die Datei sieht dann so aus:

    Mein Problem besteht darin, das ich die Zustände also Wert "0" bez "1" auslesen und in $ain1, $ain2 usw, speichern möchte.
    Bislang habe ich nur immer die ganze Zeile in einer Variable bekommen und nicht den reinen Wert.

    Wäre sehr Dankbar für eure Hilfe.

  • Über welche Programmiersprache reden wir hier?!

    Kannst Du die Erstellung der Datei beeinflussen?

    Würde am einfachsten wahrscheinlich stumpf CSV wegschreiben:

    Code
    ain1;0
    ain2;1
    ain3;0
    ain4;1
    ain5;0

    Deins sieht allerdings wie PHP aus, dann eher

    PHP
    <?php
    
    return [
       'ain1' => 0,
       'ain2' => 1,
       'ain3' => 0,
       'ain4' => 1,
       'ain5' => 0
    ];

    Du siehst den Unterscheid bei den Keys?

    Dann brauchst Du nicht umspeichern nach $ain1 sondern kannst gleich

    PHP
    <?php
    
    $data = require '/path/to/Steckdose.dat';
    
    echo 'ain1: ', $data['ain1'];

    3 Mal editiert, zuletzt von KKoPi (26. Dezember 2021 um 12:42)

  • KKoPi

    ja du hast vollkommen Recht. Es ist in php geschrieben. Hätte ich beischreiben müssen

    In der Datei "Auslesen.php" werden die Werte gespeichert.

    Code
    $steckdose = array ("ain1" => $ainStatus1, "ain2" => $ainStatus2, "ain3" => $ainStatus3,
                    ("ain4") => $ainStatus4, "ain5" => $ainStatus5 );
    $fp = fopen('/tmp/Steckdose.dat', 'w');
    fwrite($fp, print_r($steckdose, true));
    fclose ($fp);

    Und die Datei "Steckdose.dat" sieht dann wie oben aus.

    Aber dein Script geht bei mir nicht. Ich bekomme als Fehlermeldung:

    ain1: PHP Notice: Trying to access array offset on value of type int in.......

  • Da fehlt das PHP-Tag in Steckdose.dat

    PHP
    <?php
    
    // ...
    
    $steckdose = array ("ain1" => $ainStatus1, "ain2" => $ainStatus2, "ain3" => $ainStatus3,
                    ("ain4") => $ainStatus4, "ain5" => $ainStatus5 );
    
    file_put_contents('/tmp/Steckdose.dat', '<?php return ' . var_export($steckdose, true) . ';');

    Nicht print_r() für sowas verwenden!

    Gibt die Darstellung der Variablen als PHP-Code zurück

    Alternativ, zur Vollständigkeit und ggf. einfacher

    PHP
    <?php
    
    // ...
    
    $steckdose = array ("ain1" => $ainStatus1, "ain2" => $ainStatus2, "ain3" => $ainStatus3,
                    ("ain4") => $ainStatus4, "ain5" => $ainStatus5 );
    
    file_put_contents('/tmp/Steckdose.json', json_encode($steckdose));

    und

    PHP
    <?php
    
    $data = json_decode(file_get_contents('/tmp/Steckdose.json'));
    
    echo 'ain1: ', $data['ain1'];

    3 Mal editiert, zuletzt von KKoPi (26. Dezember 2021 um 13:37)

  • KKoPi

    habe jetzt beide Versionen ausprobiert. Die Datei wird jeweils erstellt mit Inhalt, aber bei beiden Versionen kommt die Fehlermeldung

    "file_put_contents(/tmp/Steckdose.json): failed to open stream: Permission denied in...." bez.

    "file_put_contents(/tmp/Steckdose.dat): failed to open stream: Permission denied in..."

    Eventuell liegt der Fehler noch ganz wo anders. Ich weiß nur nicht wo.

    Das Script wo die Werte ausgelesen und in der Datei gespeichert werden soll sieht so aus:

    Die Datei zum Auslesen der Werte:

    Dieses Script ist noch nicht fertig. Es wird später verglichen was sich verändert hat und entsprechend dann die URL erstellt um die Steckdose anzusteuern.

    Nur zur Info!

    Die Steuerung läuft einwandfrei. Nur sind die AVM Steckdosen träge beim schalten. Dadurch dauert es lange bis die Info zurückkommt das der Befehl ausgeführt wurde. Das wollte ich damit umgehen das ich den Zustand in einer Datei zwischen speichern möchte.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!