Eindeutigen Zahlenwert aus Enumeration bilden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eindeutigen Zahlenwert aus Enumeration bilden

    Ich kenne das noch von damals VB6 + WinApi. Leider ist das so lange her das ich schon fast alles wieder vergessen habe. Man konnte jedenfalls verschiedene Werte aneinander knüpfen und nachher über logische Operatoren abfragen ob Wert X im Gesamtwert vorkommt. Der Gesamtwert kann auch mehrere Zahlen enthalten.

    Hier mal ein Codebeispiel wie ich mir das vorstelle:

    <?php

    abstract class ENUM_TEST {
    const VALUE_1 = 0x10;
    const VALUE_2 = 0x20;
    const VALUE_3 = 0x30;
    const VALUE_4 = 0x40;
    const VALUE_5 = 0x50;
    const VALUE_6 = 0x60;
    const VALUE_8 = 0x70;
    const VALUE_9 = 0x80;
    const VALUE_10 = 0x90;
    const VALUE_11 = 0x100;
    const VALUE_12 = 0x110;
    }

    // Wert berechnen
    $Zielwert = Besteht aus ENUM_TEST::VALUE_5 und ENUM_TEST::VALUE_12 beispielsweise.

    // Werte abfragen
    Besteht $Zielwert aus ENUM_TEST::VALUE_12?

  • #2
    Dazu benutzt man üblicherweise Zahlenwerte, die mit den Zweier-Potenzen übereinstimmen (1, 2, 4, 8, …), analog zu bspw. den vordefinierten error level-Konstanten, und kombiniert das mit den bitweisen Operatoren & und |, um „abzufragen“, ob bestimmte Bits gesetzt sind oder nicht.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Super danke! Das war's.. Kannst du mal schauen ob das richtig implementiert ist ? Funktioniert 1A aber sicher ist sicher:

      PHP-Code:
      <?php

      abstract class ENUM_TEST {
          const 
      VALUE_1 1;
          const 
      VALUE_2 2;
          const 
      VALUE_3 4;
          const 
      VALUE_4 8;
          const 
      VALUE_5 16;
          const 
      VALUE_6 32;
          const 
      VALUE_7 64;
          const 
      VALUE_8 128;
          const 
      VALUE_9 256;
          const 
      VALUE_10 512;
          const 
      VALUE_11 1024;
          const 
      VALUE_12 2048;
      }

      // Wert berechnen
      $Zielwert ENUM_TEST::VALUE_5 ENUM_TEST::VALUE_12;

      // Prüfen welche Werte gesetzt sind
      if ($Zielwert ENUM_TEST::VALUE_1) {
          print 
      "1 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_2) {
          print 
      "2 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_3) {
          print 
      "3 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_4) {
          print 
      "4 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_5) {
          print 
      "5 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_6) {
          print 
      "6 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_7) {
          print 
      "7 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_8) {
          print 
      "8 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_9) {
          print 
      "9 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_10) {
          print 
      "10 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_11) {
          print 
      "11 gecheckt\n";
      }

      if (
      $Zielwert ENUM_TEST::VALUE_12) {
          print 
      "12 gecheckt\n";
      }

      Und Frage 2: Kann man auch über eine Mysql Query via bitweise-operatoren abfragen? Der Hintergrund ist mehrere solcher Werte in eine DB zu speichern und bei 400.000 Datensätzen aufwärts müsste das auch direkt über mysql möglich sein...

      Kommentar


      • #4
        In MySQL ließe sich das mit den ENUM/SET-Datentypen abbilden; und selektion dann mit FIND_IN_SET – allerdings ist das nicht sonderlich performant.

        Du solltest eher vernünftig normalisieren, und diese Werte in eine zusätzliche Eigenschaften-Tabelle auslagern.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Alles klar vielen Dank!

          Kommentar

          Lädt...
          X