php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Eindeutigen Zahlenwert aus Enumeration bilden


 
rabbit7
10-11-2015, 10:02 
 
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?

 
wahsaga
10-11-2015, 10:57 
 
Dazu benutzt man üblicherweise Zahlenwerte, die mit den Zweier-Potenzen übereinstimmen (1, 2, 4, 8, …), analog zu bspw. den vordefinierten error level-Konstanten (http://php.net/manual/en/errorfunc.constants.php), und kombiniert das mit den bitweisen Operatoren (http://php.net/manual/en/language.operators.bitwise.php) & und |, um „abzufragen“, ob bestimmte Bits gesetzt sind oder nicht.

 
rabbit7
10-11-2015, 11:05 
 
Super danke! Das war's.. Kannst du mal schauen ob das richtig implementiert ist ? Funktioniert 1A aber sicher ist sicher:


<?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...

 
wahsaga
10-11-2015, 11:20 
 
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.

 
rabbit7
10-11-2015, 11:23 
 
Alles klar vielen Dank!

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:56 Uhr.