Auswahl und Ausgabe optimieren

Maxm123

Erfahrenes Mitglied
Folgendes sei gegen.

10 Checkboxen in einer Tabelle mit einem zugewiesenen Wert. Dahinter ein Name. ( das O soll jetzt mal die Checkbox darstellen).

O (Value=2) - Peter1
O (Value=4) - Peter2
O (Value=8) - Peter3
O (Value=16) - Peter4
O (Value=32) - Peter5
O (Value=64) - Peter6
O (Value=128) - Peter7
O (Value=265) - Peter8
O (Value=512) - Peter9
O (Value=1024) - Peter10

Nehmen wir an man wählt Peter2, 5,7 und 9 aus, gibt die Zahlen weiter an ein Script die diese dann addiert und in eine SQL Tabelle einträgt.

Also steht in der Tabelle dann 676.

Dazu habe ich noch eine Tabelle in der zu jedem Peter auch noch einmal der Wert zum Namen steht

ID Value Name
1 2 Peter1
2 4 Peter2
...


Nun das Problem:

Ich will das wenn man mit PHP den Wert 676 ausließt aus der Tabelle gleich die Namen Peter2, Peter5, Peter7 und Peter9 ausgeben lassen.
Ich weiß das es geht aber ich weißt nicht wie bzw wie ich das umsetzten soll. Ich würde mich über eure Hilfe freuen.

Danke :)
 
Moin Max,

meinst du so:

SQL:
SELECT * FROM tabelle where 676 & Value

...ich hoffe aber, du hast nicht vor, dort mit zu viel "Peters" zu hantieren...bei 64 ist Schluss.

Man nennt das übrigens Bitwise AND, falls du dich darüber weiter informieren möchtest.
 
Naja ich will halt die 676 wieder in seine einzelnen Bestandteile zerlegen und 676 ergeben ja nur 4 + 32 + 128 + 512. Der Link ist ja ganz gut aber Hilft er mir bei meinem speziellen Problem weiter? Sorry ich kann damit nichts anfangen bzw. ich kann ich nicht zu dem umsetzten wie ich es brauche. Kannst du mir vielleicht einen Ansatz geben für das PHP Script um die 676 in seine einzelnen Zahlen zu zerlegen. Ich wette wenn man es einmal kapiert hat ist es sau einfach...

Danke schon mal
 
Hab grad keine Ahnung ob es für BITWISE AND in PHP was gibt.
Aber so gehts auch:

PHP:
function bitwiseAnd(&$results, $value){
    $results[] = $result = floor(log($value, 2));
    if (0 < $value = $value - pow(2, $result)){
        bitwiseAnd($results, $value);
    }
}

$value = 676;
bitwiseAnd($results, $value);
var_dump($results);
 
Das funktioniert ja schon fast so wie ich will :) nur gibt mir jetzt der Browser das
HTML:
array(4) { [0]=>  float(9) [1]=>  float(7) [2]=>  float(5) [3]=>  float(2) }
aus.

Man sieht ja hier das er die 2,5,7 und 9 wieder hat. Wie bekomme ich das hin das er diesen Text nicht mehr anzeigt aber mir für jede ausgelesene Zahl folgendes anlegt.

PHP:
$v1="2";
$v2="5";
.
.
.
halt immer für so viele Zahlen wie ausgelesen werden. Wenn das noch klappen würde ist mein Problem gelöst :)

EDIT://
1. Teil gelöst. Einfach var_dump rausnehmen. :)

EDIT:// ;)
Ich bin jetzt schon mal so weit
PHP:
function bitwiseAnd(&$results, $value){
    $results[] = $result = floor(log($value, 2));
    if (0 < $value = $value - pow(2, $result)){
        bitwiseAnd($results, $value);
    }
}

$value = 676;
bitwiseAnd($results, $value);

foreach ($results as $v) {
    echo $v . "<br>";
  }

augegeben bekomme ich folgendes:
HTML:
9
7
5
2

so wie schon gesagt eigentlich möchte ich es nich ausgegeben haben sondern in $v1, $v2,... usw stecken :)
 
Zuletzt bearbeitet:
@yaslaw: Bitoperationen gibts natürlich auch in PHP:

Beispiel:
PHP:
<?php
$arr  = array();
$bit  = 1;
$wert = 676;

while($wert)
{
  if($wert & $bit)
  {
    $arr[]=$bit;
    $wert=$wert^$bit;
  }
  $bit=$bit<<1;
}
//Test
print_r($arr);
?>

@Max:
Es sei angemerkt, dass dieses Hin-und herspeichern der Bits nicht der Sinn der Sache ist, wozu benötigst du denn diese Variablen?
 
Die ganze Sache ist für ein Adminpanel wo man einem Fotoalbum Benutzern zuweisen kann und ich habe mir gedacht wenn man die Benutzer mal ändern will kann man gleich aus der Zahl 676 auslesen wer drauf zugreifen kann und wer nicht.. So bekomme ich ja meine Zahlen 2,5, 7,9 und kann so einfach dem Album benutzer zuteilen. Für mich der beste weg aber bitte erklärt mir doch jetzt jemand wie ich 2,5,7,9 noch $v1, $v2 usw zuteilen kann. Danke :)
 
....und ich habe mir gedacht wenn man die Benutzer mal ändern will kann man gleich aus der Zahl 676 auslesen wer drauf zugreifen kann und wer nicht.

Das macht doch schon das QUERY, welches ich gepostet habe.

Code:
SELECT * FROM tabelle WHERE 676 & Value

Das liefert dir bei einem Wert von 676 die Datensätze aus der Tabelle tabelle, wo die Spalte Value einen der Werte 4,32,128 oder 512 hat.
 
Zurück