der henry: js, associative arrays mit integriertem array erzeugen

Guten Morgen,

ich möchte aus verschiedenen Feldern (Input) ein assoziative array erzeugen,

Das Array sollte nach dem erstellen so aussehen. (Vorgabe)

myArray = ["name"=>"Anlage EIN", "type"=>"switch", "headline"=>"Maschine 1",
           "valuerange"=>["varname"=>"xyz", "bgcolor"=>"081500"],
                         ["varname"=>"abc", "bgcolor"=>"471100"]];

Wie kann ich das Array erzeugen?

myArray['name'] = "neuer Name";

ist klar.

Wie mache ich es aber mit dem zusätzlichen Array im Array?? Die Felder (Input) haben auch jeweils eine eindeutige "id" ("varname_0", "bgcolor_0", ""varname_1", "bgcolor_1" usw.)

Somit würde "varname_0" "xyz" überschreiben/erzeugen.

Ich hoffe ich konnte es gut erklären.

Hier habe ich schon länger rumprobiert, irgendwie sehe ich es nicht ....

Vielen Dank

der henry

  1. Hallo,

    es hat sich erledigt. Ich habe eigene Arrays erstellt und zum Schluss miteinander verbunden.

    Vielen Dank!

  2. Lieber henry,

    die Idee eines assoziativen Arrays kommt aus PHP. In JavaScript verwenden wir Objekte mit passenden Eigenschaften:

    const myData = {
      "name": "Anlage EIN",
      "type": "switch",
      "headline": "Maschine 1",
      "valuerange": [
        {
          "varname": "xyz",
          "bgcolor": "081500"
        },
        {
          "varname": "abc",
          "bgcolor": "471100"
        }
      ]
    };
    

    Die Eigenschaftsnamen habe ich in doppelte Anführungszeichen gesetzt. Das hätte es hier nicht gebraucht. Aber so ist es kompatibel zum JSON-Format. Dein Server sollte die Daten am Besten gleich so senden, damit du sie mit JavaScript direkt verarbeiten kannst.

    Liebe Grüße

    Felix Riesterer

  3. Lieber henry,

    nur noch als Nachtrag, da Array-Daten in einem Formular zu erheben nicht trivial ist.

    Die Felder (Input) haben auch jeweils eine eindeutige "id" ("varname_0", "bgcolor_0", ""varname_1", "bgcolor_1" usw.)

    PHP bietet für solche Fälle an, dass man als POST-Schlüssel einen Namen mit eckigen Klammern verwendet:

    <input name="zutaten[]" type="checkbox" value="Tomaten">
    

    Das ist für die Verarbeitung mit PHP durchaus praktisch. Da PHP als Schlüssel zutaten[] sieht, wird es ein Array namens $_POST['zutaten'] anlegen und jeden so übertragenen POST-Wert als Array-Element hinzufügen:

    $_POST = [
      'zutaten' => ['Tomaten']
    ];
    

    Manchmal will man das aber explizit nicht. Vor allem dann nicht, wenn man mehrere Schlüssel-Wert-Paare für einen Datensatz haben will:

    <li>
      <input id="zutat-1" name="zutat-1" type="checkbox" value="Tomate">
      <label for="zutat-1">Tomate</label>
      <label for="menge-1">Gewicht in Gramm</label>
      <input id="menge-1" name="menge-1" type="number" min="1" max="200" value="1">
    </li>
    

    Hier hat man in den POST-Daten garantiert das Schlüssel-Wert-Paar menge-1=1, aber vielleicht keinen Schlüssel zutat-1, weil der Benutzer die Checkbox dafür nicht angehakt hat. Das soll ja bedeuten, dass die Mengenangabe für die Tomaten ohne Bedeutung ist, weil die Zutat überhaupt nicht verwendet werden soll. Stellen wir uns vor, das Formular käme mit diesen Werten an:

    $_POST = [
      'menge-1' => 1,
      'menge-2' => 40,
      'menge-3' => 1,
      'menge-4' => 1,
      'menge-5' => 7,
      'zutat-2' => 'Schinken'
      'zutat-5' => 'Salami'
    ];
    

    Hätte man hier die für PHP spezielle Array-Schreibweisen verwendet, wäre das Ergebnis dieses hier:

    $_POST['menge'] = [1, 40, 1, 1, 7];
    $_POST['zutaten'] = ['Schinken', 'Salami'];
    

    Hier hilft das Sammelarray für die Mengen überhaupt nicht, weil nicht mehr klar ist, welche Menge nun für den Schinken gilt und welche für die Salami.

    Will man nun die nummerierten Schlüssel in einer Schleife auslesen, verwendet man am besten ein reguläres Suchmuster, welches sich für das Ende des jeweiligen Schlüssels interessiert, indem es das Minuszeichen und die folgenden Ziffern haben möchte:

    $zutaten = [];
    
    foreach ($_POST as $key => $value) {
    
      // $key endet auf "-123"? $found[1] enthält dann "123"
      if (preg_match('~-(\d+)$~', $key, $found)) {
    
        $nummer = $found[1];
        $typ = preg_replace('~-\d+$~', '', $key); // entferne -123 am Ende
    
        if (!array_key_exists($nummer, $zutaten)) {
          $zutaten[$nummer] = [];
        }
    
        $zutaten[$nummer][$typ] = $value;
      }
    }
    

    Jetzt hat man die POST-Werte in einem Array, welches alle zu einer Zutat gehörenden Daten als Unter-Array enthält. Für obiges Beispiel sähe das Ergebnis so aus:

    $zutaten = [
      1 => ['menge' => 1],
      2 => ['menge' => 40, 'zutat' => 'Schinken'],
      3 => ['menge' => 1],
      4 => ['menge' => 1],
      5 => ['menge' => 5, 'zutat' => 'Salami']
    ];
    

    Somit kann man nun die empfangenen POST-Daten danach auswerten, in welchem Datensatz (Unterarray von $zutaten) es überhaupt einen Wert für zutat gibt, um den Datensatz nur dann zu akzeptieren und zu verarbeiten.

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      kann man nicht auch name="zutat[0]" bzw. name="menge[0]" verwenden, auf diese Weise ein Array in $_POST["zutat"] etc erhalten und sich auf diese Weise den Tyrannosuchus Regex sparen?

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Lieber Rolf,

        können kann man vieles. Mir ging es darum, dass man nicht unbedingt eine PHP-eigene Schreibweise verwenden muss, um das Gleiche zu erreichen.

        und sich auf diese Weise den Tyrannosuchus Regex sparen?

        Es ist mein persönlicher Spleen, dass mir der T-Rex lieber ist, als PHP-spezifische Schlüssel zu verwenden.

        Liebe Grüße

        Felix Riesterer

    2. Ergänzung: Habe das im Wiki an passender Stelle eingearbeitet.

      Liebe Grüße

      Felix Riesterer