Yadgar: Indexwert von Array-Element ermitteln?

Hi(gh)!

Folgendes Problem:

In einem Formular soll per <select> einer von 97 verschiedenen String-Werten (konkret: Tonbezeichnungen über acht Oktaven hinweg, in einem vorher definierten Array gespeichert) ausgewählt werden. Die Datenbank erwartet aber Integer-Werte (von 0 bis 96). Da ich aber keine riesenlange switch-Struktur mit 97 Verzweigungen programmieren will, hätte ich gerne gewußt, ob es in PHP möglich ist, ausgehend vom Inhalt eines Arrayelements dessen Indexwert zu ermitteln, etwa so (das Array heißt $keynames_de):

$i = index($keynames_de, ",C")
// $i = 12;

Kennt PHP eine solche Funktion?

Bis bald im Khyberspace!

Yadgar

  1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    In einem Formular soll per <select> einer von 97 verschiedenen String-Werten (konkret: Tonbezeichnungen über acht Oktaven hinweg, in einem vorher definierten Array gespeichert) ausgewählt werden. Die Datenbank erwartet aber Integer-Werte (von 0 bis 96). Da ich aber keine riesenlange switch-Struktur mit 97 Verzweigungen programmieren will, hätte ich gerne gewußt, ob es in PHP möglich ist, ausgehend vom Inhalt eines Arrayelements dessen Indexwert zu ermitteln, etwa so (das Array heißt $keynames_de):

    $i = index($keynames_de, ",C")
    // $i = 12;
    

    Kennt PHP eine solche Funktion?

    Guckst Du unter array_keys()

    Wenn der Wert mehrmals im Array sein kann.

    Sonst guckst Du noch unter

    array_flip().

    Das kann dir helfen, wenn es alle Werte nur einmal im Array gibt.

    Spirituelle Grüße
    Euer Robert
    robert.r@online.de

    --
    Möge der wahre Forumsgeist ewig leben!
    1. Sonst guckst Du noch unter

      array_flip().

      Habe ich gerade gelesen. Mein PHP-Array sieht so aus:

      $arr_firmen = array(
       array( "000","Firma","Geschäftsfelder"
        ,"logo_url","beschreibung_url" )
      ,array( "001","Karl Müller","Konditorei"
        ,"http://example.com/logo_4711.jpg"
        ,"http://example.com/mueller.htm")
      ,array( "032","Bernd Schäfer" ,"Versicherungen"
        ,"http://example.com/logo_4821.jpg"
        ,"http://example.com/schaefer.htm")
      );
      

      Gerne möchte ich echo $arr_firmen['032'][1]; ausgeben, obwohl da nur drei Positionen sind.

      Da mus ich eine Funktion multi_array_flip aber selbst schreiben?

      Linuchs

      1. Gerne möchte ich echo $arr_firmen['032'][1]; ausgeben, obwohl da nur drei Positionen sind.

        Es macht nicht immer Sinn, ein führendes Hochkomma in ein Tiefkomma zu verwandeln.

        In meinen HTML-Dokumenten löse ich das so, dass ich das auf der Tastatur fehlende Anführungszeichen (Gegensatz: Abführungszeichen?) mit doppelten quotes eingebe und mit der Suchen/Ersetzen-Funktion des Browsers umsetze.

        Linuchs

  2. @@Yadgar

    In einem Formular soll per <select> einer von 97 verschiedenen String-Werten

    Da scrollt man sich ja dumm und dähmlich! Bei der Anzahl von Optionen ist select wohl nicht das beste UI-Element.

    (konkret: Tonbezeichnungen über acht Oktaven hinweg,

    Radiobuttons, per CSS als Klaviatur gestylt – für breite Viewports. Für schmale müsste man sich noch was einfallen lassen, vielleicht horizontales Scrollen mit deutlicher Anzeige, welche Oktave(n) jeweils zu sehen ist.

    Die Datenbank erwartet aber Integer-Werte (von 0 bis 96).

    Warum liefern die option-Elemente nicht gleich die Zahlenwerte?

    <option value="12">,C</option>
    

    LLAP

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. @@Gunnar Bittersmann

      Radiobuttons, per CSS als Klaviatur gestylt

      Es sage niemand, das ginge nicht. Geht nämlich.

      Nachtrag: Ich weiß, das div wäre gern ein fieldset. Das widersetzt sich aber irgendwie dem Stylen.

      Die Datenbank erwartet aber Integer-Werte (von 0 bis 96).

      BTW, da es mit MIDI dafür schon einen Standard gibt, hätte ich dessen Zahlenwerte genommen.

      LLAP

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        @@Gunnar Bittersmann

        Radiobuttons, per CSS als Klaviatur gestylt

        hast Du mal versucht, das auf 'nem Tablet zu bedienen?

        Es sage niemand, das ginge nicht. Geht nämlich.

        Die Datenbank erwartet aber Integer-Werte (von 0 bis 96).

        BTW, da es mit MIDI dafür schon einen Standard gibt, hätte ich dessen Zahlenwerte genommen.

        Gute Idee :-)

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. @@robertroth

          Radiobuttons, per CSS als Klaviatur gestylt

          hast Du mal versucht, das auf 'nem Tablet zu bedienen?

          Was ist das Problem?

          Es sage niemand, das ginge nicht. Geht nämlich.

          Hab noch den -webkit-Präfix ergänzt. (Im Dabblet läuft das Prefixfree-JS, dashalb ist es dort nicht erforderlich.)

          LLAP

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            Radiobuttons, per CSS als Klaviatur gestylt

            hast Du mal versucht, das auf 'nem Tablet zu bedienen?

            Was ist das Problem?

            Es sage niemand, das ginge nicht. Geht nämlich.

            Hab noch den -webkit-Präfix ergänzt. (Im Dabblet läuft das Prefixfree-JS, dashalb ist es dort nicht erforderlich.)

            Auf dem Standard-PC konnte ich das jetzt nachvollziehen.

            Was ich aber nicht hinbekomme, ist das Anzeigen, welches Radio-Element ich nun getroffen habe, also Auswertung von selected bzw ::selection (?) im CSS

            Spirituelle Grüße
            Euer Robert
            robert.r@online.de

            --
            Möge der wahre Forumsgeist ewig leben!
            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              Radiobuttons, per CSS als Klaviatur gestylt

              hast Du mal versucht, das auf 'nem Tablet zu bedienen?

              Was ist das Problem?

              Es sage niemand, das ginge nicht. Geht nämlich.

              Hab noch den -webkit-Präfix ergänzt. (Im Dabblet läuft das Prefixfree-JS, dashalb ist es dort nicht erforderlich.)

              Auf dem Standard-PC konnte ich das jetzt nachvollziehen.

              Was ich aber nicht hinbekomme, ist das Anzeigen, welches Radio-Element ich nun getroffen habe, also Auswertung von selected bzw ::selection (?) im CSS

              Bevor Du dich beschwerst: "checked" habe ich natürlich auch ausprobiert...

              Aber ich habe wohl noch nicht verstanden, WAS da eigentlich angezeigt wird. Das Radio-Element selber ist es ja wohl nicht mehr.

              Spirituelle Grüße
              Euer Robert
              robert.r@online.de

              --
              Möge der wahre Forumsgeist ewig leben!
              1. @@robertroth

                Aber ich habe wohl noch nicht verstanden, WAS da eigentlich angezeigt wird. Das Radio-Element selber ist es ja wohl nicht mehr.

                Nein, die sind versteckt. Was zu sehen ist, sind die zugehörigen Label.

                Die Clicks (Taps, Auswahl per Tastatur) auf die Label werden ja an die jeweiligen input-Elemente durchgereicht, auch wenn diese nicht sichtbar sind.

                IIRC dürfen sie dazu aber nicht mit display: none versteckt sein; deshalb visibility: hidden.

                LLAP

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            2. @@robertroth

              Was ich aber nicht hinbekomme, ist das Anzeigen, welches Radio-Element ich nun getroffen habe, also Auswertung von selected bzw ::selection (?) im CSS

              Da die Radiobuttons nicht sichtbar sind, muss deren Auswahl/Nichtauswahl bei den zugehörigen Labels visualisiert werden.

              Da die input-Elemente innerhalb der label-Elemente sind, per
              .keyboard label:has(input:checked) – demnächst in Ihrem Browser.

              (Auch deshalb ist es angebracht, input nicht in label zu schachteln, sondern label als nachfolgendes Geschwistenelement von input zu haben. Dann geht’s per
              .keyboard input:checked + label – auch heute schon (außer in Browsern, die vom WebKit Adjacent/General Sibling & Pseudo Class Bug betroffen sind).
              Habe ich hier ausnahmsweise mal anders gemacht. Und das kommt eben dabei raus.)

              Ich hab ein JavaScript nachgerüstet, was eine Klasse beim label-Element setzt bzw. entfernt.

              LLAP

              --
              „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              1. @@Gunnar Bittersmann

                Auch deshalb ist es angebracht, input nicht in label zu schachteln, sondern label als nachfolgendes Geschwistenelement von input zu haben.

                Und deshalb.

                LLAP

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              2. @@Gunnar Bittersmann

                (Auch deshalb ist es angebracht, input nicht in label zu schachteln, sondern label als nachfolgendes Geschwistenelement von input zu haben. Dann geht’s per
                .keyboard input:checked + label – auch heute schon (außer in Browsern, die vom WebKit Adjacent/General Sibling & Pseudo Class Bug betroffen sind).
                Habe ich hier ausnahmsweise mal anders gemacht. Und das kommt eben dabei raus.)

                Ich hab ein JavaScript nachgerüstet, was eine Klasse beim label-Element setzt bzw. entfernt.

                So, ich hab’s dann mal umgebaut. Für dich, @adactio. ;-)

                LLAP

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        2. @@robertroth

          hast Du mal versucht, das auf 'nem Tablet zu bedienen?

          Eingabe: hast Du mal versucht, das auf 'nem Tablet zu bedienen?

          Angezeigt wird: hast Du mal versucht, das auf ‚nem Tablet zu bedienen?

          Go home, CForum, you’re drunk.

          Kann man die automatische Umwandlung in „smart quotes“ nicht abschalten? Die ist nämlich oft eher dumb.

          LLAP

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      2. @@Gunnar Bittersmann

        Nachtrag: Ich weiß, das div wäre gern ein fieldset. Das widersetzt sich aber irgendwie dem Stylen.

        Hier anzusehen. fieldset kommt irgendwie mit flex nicht klar.

        Den Whitespace zwischen den labels mit magic number wegzukriegen, kann auch nicht die Lösung sein.

        LLAP

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      3. @@Gunnar Bittersmann

        Radiobuttons, per CSS als Klaviatur gestylt

        Es sage niemand, das ginge nicht. Geht nämlich.

        Und warum sagt mir niemand, dass ich die Klassen falschrum benannt hatte? Die für ♯ und ♭ sind doch die schwarzen, ähm!

        ♫ Ebony, ivory, living in perfect harmony…

        LLAP

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. Hallo Gunnar Bittersmann,

          Und warum sagt mir niemand, dass ich die Klassen falschrum benannt hatte? Die für ♯ und ♭ sind doch die schwarzen, ähm!

          ♫ Ebony, ivory, living in perfect harmony…

          Bartolomeo Cristofori hätte das gewusst. Google ehrt den Erfinder des Klaviers anlässlich seines 360. Geburtstages heute mit einem Doodle.

          Wie passend.

          Bis demnächst
          Matthias

          --
          Signaturen sind bloed (Steel) und Markdown ist mächtig.
          1. @@Matthias Apsel

            Bartolomeo Cristofori hätte das gewusst. Google ehrt den Erfinder des Klaviers anlässlich seines 360. Geburtstages heute mit einem Doodle.

            Was einem so alles entgeht, wenn man Google als Suchmaschine abgewählt hat.

            LLAP

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
  3. Da es sich um Noten handelt brauchst du nicht unbedingt die Array Keys. Du kannst den Notenwert auch errechnen. Eine Oktave besteht ja aus 12 Tönen die in ihren Bezeichnungen nicht variieren. Du brauchst also u.U. kein unschönes Array mit 97 Einträgen.

    So könnte ein Pseudo-Code aussehen:

    // $keyvalue ist deine gewählte Taste
    // $trigger_grossbuchstaben = ab wann du Großbuchstaben für Oktavbezeichnungen möchtest z.b. Große-, Kontra- und Subkontraoktave
    
    $notennummer = $kevalue % 12;
    $oktave = $keyvalue / 12;
    $notennamen_de = ["c", "des", "d", "es", "e", ...]
    $notenname_de = $notennamen_de[$notennummer];
    
    if($oktave < $trigger_großbuchstaben){ // z.B.für die Große Oktave
    	$notenname_de = strtoupper($notenname_de);
    }
    
    if($oktave > $trigger_striche){ // eingestrichen, zweigestrichen ...
    	$notenname_de .= str_repeat("'", $oktave - $trigger_striche);
    }
    
    echo $notenname_de;
    

    Randbemerkung: Das Problem enharmonische Verwechslung musst du selbst lösen.

    lg