Ein Brainstorming-Forum, sehr schöne Idee
Ich steh auch mal wieder vor dem Problem, dass PHP nur bis 32-Bit rechnen kann.
Das klingt soooo viel, isses aber bei einer riesigen Anzahl beliebig kombinierbarer Räume oder Plätze überhaupt nicht. Da arbeitet man sinnvollerweise mit Bitmasken.Die Binärzahl
bedeutet natürlich, dass Raum Nr. 32, Raum Nr. 2 und Raum Nr. 1 belegt sind.
Die 1 links bedeutet in (dezimaler) Wirklichkeit den stolzen Wert von 2 hoch 31, was wohl begreifen lässt dass hier selbst 128 Bit gar nix besonderes und im Nu erreicht sind!
Ein schönes Beispiel wäre die Drei ???-Folge "Die gefährliche Erbschaft" (17), in der der Ozeandampfer "Queen of South" [QoS] 500 Betten hatte!
Man stelle sich vor, hier für eine Management-Software eine Bitmaske aufstellen zu müssen die ALLE Kombinationen erschlägt, welche Passagierbetten z. Z. frei und welche belegt sind! 2 hoch 499 ist der Höchstwert! Da kommt doch Freude auf...
Jetzt angenommen, die GMP-Extension gäbe es (noch) nicht, oder das soll auf einen bestehenden PHP4-Kundenserver, bei dem der Kunde nicht unbedingt begeistert wäre, wenn ich an seinem Server herumfummle...
Dann ist das gar nicht so simpel, wenn man mit Checkboxen arbeitet, bei denen man sich bei Wertübergabe auf *EINEN* Wert pro Box beschränken muss.
Ich hab mir das so gedacht:
Ich splitte das Ganze zunächst in Gruppen auf.
Also im QoS-Beispiel mit etwas weniger Betten (100):
Oberdeck (24 B. [0..23] ; Gruppe 0, 24bit, voll)
Poopdeck (18 B. [0..19]; Gruppe 1, 24bit, 6bit ungenutzt)
Backdeck (16 B. [0..15]; Gruppe 2, 16bit, voll)
Hauptdeck (30 B. [0..29]; Gruppe 3, 32bit, 2bit ungenutzt)
Unterdeck (22 B. [0..21]; Gruppe 4, 24bit, 2bit ungenutzt)
Durch diese Struktur wird die Bitmaske allein nun sinnlos, und sie muss immer mit einem sog. Gruppenschlüssel in Kombination stehen.
Z. B. der Hex-Wert $0800 (binär 0000100000000000) kann sowohl das Bett Nr. 11 im Oberdeck als auch das im Backdeck bezeichnen!
Das Ganze ist auch deswegen absolut notwendig, weil es möglich sein muss, gleichzeitig Klicks in verschiedene Decks zu machen, und damit auch mit einer Datenbankabfrage den Status bei allen "berührten" Decks abzufragen!
Angenommen, die Decks sind untereinander aufgeteilt in Kompetenzbereiche. Dann macht der Schiffsangestellte A das Haupt- und Unterdeck, und der Schiffsangestellte B die anderen 3 Decks! Natürlich soll es auch möglich sein, dass die Kompetenzbereiche getrennt bleiben; d. h. dass der eine nicht im Bereich des anderen herumpfuschen können soll!
Wie sieht so eine Checkboxen-Gruppe bei HTML aus? Bekanntlich doch so:
Aha. Also wir haben *EINEN* Wert, benötigen aber Bitmaske UND Gruppenschlüssel.
Was definitiv geht ist etwas Mathematik:
D. h. ich errechne mir bei angeklickter Checkbox nachher im Script den Gruppenschlüssel bei ganzzahliger Division durch 100:
groupkey_int = value_int / 100;
Und mit "value & 1" kann ich sogar bei einer Dezimalzahl (!) ggf. prüfen, ob der 1er aktiv ist.
(Simples Draufaddieren - und hinterher Subtrahieren - geht hier IMHO *nicht*: ein Wert von "3" könnte heißen "3 + 0", also Gruppe 3 - inaktiv, oder "2 + 1" Gruppe 2 - aktiv! Zu mehrdeutig!)
Gibt es noch mehr Vorschläge?
Ich steh auch mal wieder vor dem Problem, dass PHP nur bis 32-Bit rechnen kann.
Das klingt soooo viel, isses aber bei einer riesigen Anzahl beliebig kombinierbarer Räume oder Plätze überhaupt nicht. Da arbeitet man sinnvollerweise mit Bitmasken.Die Binärzahl
Code:
1000 0000 0000 0000 0000 0000 0000 0011
Die 1 links bedeutet in (dezimaler) Wirklichkeit den stolzen Wert von 2 hoch 31, was wohl begreifen lässt dass hier selbst 128 Bit gar nix besonderes und im Nu erreicht sind!
Ein schönes Beispiel wäre die Drei ???-Folge "Die gefährliche Erbschaft" (17), in der der Ozeandampfer "Queen of South" [QoS] 500 Betten hatte!
Man stelle sich vor, hier für eine Management-Software eine Bitmaske aufstellen zu müssen die ALLE Kombinationen erschlägt, welche Passagierbetten z. Z. frei und welche belegt sind! 2 hoch 499 ist der Höchstwert! Da kommt doch Freude auf...
Jetzt angenommen, die GMP-Extension gäbe es (noch) nicht, oder das soll auf einen bestehenden PHP4-Kundenserver, bei dem der Kunde nicht unbedingt begeistert wäre, wenn ich an seinem Server herumfummle...
Dann ist das gar nicht so simpel, wenn man mit Checkboxen arbeitet, bei denen man sich bei Wertübergabe auf *EINEN* Wert pro Box beschränken muss.
Ich hab mir das so gedacht:
Ich splitte das Ganze zunächst in Gruppen auf.
Also im QoS-Beispiel mit etwas weniger Betten (100):
Oberdeck (24 B. [0..23] ; Gruppe 0, 24bit, voll)
Poopdeck (18 B. [0..19]; Gruppe 1, 24bit, 6bit ungenutzt)
Backdeck (16 B. [0..15]; Gruppe 2, 16bit, voll)
Hauptdeck (30 B. [0..29]; Gruppe 3, 32bit, 2bit ungenutzt)
Unterdeck (22 B. [0..21]; Gruppe 4, 24bit, 2bit ungenutzt)
Durch diese Struktur wird die Bitmaske allein nun sinnlos, und sie muss immer mit einem sog. Gruppenschlüssel in Kombination stehen.
Z. B. der Hex-Wert $0800 (binär 0000100000000000) kann sowohl das Bett Nr. 11 im Oberdeck als auch das im Backdeck bezeichnen!
Das Ganze ist auch deswegen absolut notwendig, weil es möglich sein muss, gleichzeitig Klicks in verschiedene Decks zu machen, und damit auch mit einer Datenbankabfrage den Status bei allen "berührten" Decks abzufragen!
Angenommen, die Decks sind untereinander aufgeteilt in Kompetenzbereiche. Dann macht der Schiffsangestellte A das Haupt- und Unterdeck, und der Schiffsangestellte B die anderen 3 Decks! Natürlich soll es auch möglich sein, dass die Kompetenzbereiche getrennt bleiben; d. h. dass der eine nicht im Bereich des anderen herumpfuschen können soll!
Wie sieht so eine Checkboxen-Gruppe bei HTML aus? Bekanntlich doch so:
Code:
<input type="checkbox" name="belegung[]" value="4711"> <input type="checkbox" name="belegung[]" value="4712">
Was definitiv geht ist etwas Mathematik:
Code:
<input type="checkbox" name="belegung[]" value="201"> <input type="checkbox" name="belegung[]" value="201">
groupkey_int = value_int / 100;
Und mit "value & 1" kann ich sogar bei einer Dezimalzahl (!) ggf. prüfen, ob der 1er aktiv ist.
(Simples Draufaddieren - und hinterher Subtrahieren - geht hier IMHO *nicht*: ein Wert von "3" könnte heißen "3 + 0", also Gruppe 3 - inaktiv, oder "2 + 1" Gruppe 2 - aktiv! Zu mehrdeutig!)
Gibt es noch mehr Vorschläge?
Kommentar