expertenaustausch > comp.lang.* > comp.lang.php.misc

Andreas Gräber (29.09.2009, 12:01)
Hallo.

Ich suche verzweifelt nach einem Lösungsansatz um die einzelnen Werte
einer kumulierten summe zu errechnen.

Folgender Zustand

Es gibt 2 Tabellen

Kategorien
----------
kategorie_id
kategorie_name

Angebote
--------
angebot_id
....
kategorie

Die kategorien sind so angelegt daß die IDs sich verdoppeln

1 -> Kategorie 1
2 -> Kategorie 2
4 -> Kategorie 3
8 -> Kategorie 4
16-> Kategorie 5

In Angebote ist der kumulierte Wert erfasst (also z.B. 20 wenn das
Angebot in Kategorie 4 und 5 erscheinen soll, oder 21 wenn es in
Kategorie 1+3+5 erscheinen soll).

Was ich nun suche ist ein Lösungsansatz um bei übergabe der Zahl 21
wieder die Einzelwerte auszugeben um auf diese Summe zu kommen.

Hat jemand Rat?

Gruß,
Andreas
Stefan Froehlich (29.09.2009, 12:06)
On Tue, 29 Sep 2009 12:01:27 Andreas Gräber wrote:
> In Angebote ist der kumulierte Wert erfasst (also z.B. 20 wenn das
> Angebot in Kategorie 4 und 5 erscheinen soll, oder 21 wenn es in
> Kategorie 1+3+5 erscheinen soll).


> Was ich nun suche ist ein Lösungsansatz um bei übergabe der Zahl 21
> wieder die Einzelwerte auszugeben um auf diese Summe zu kommen.


Zaehler initialisieren.

Die Zahl Halbieren, in ganzzahligen Anteil und Rest trennen. Abhaengig vom
Rest (0 oder 0.5) ist die entsprechende Kategorie vorhanden oder nicht.

Zaehler hochzaehlen, das ganze in eine Schleife packen und mit dem
ganzzahligen Anteil als neue Zahl weitermachen. Fertig bist Du, sobald der
ganzzahlige Anteil 0 ist.

Servus,
Stefan
Claus Reibenstein (29.09.2009, 12:37)
Andreas Gräber schrieb:

> Die kategorien sind so angelegt daß die IDs sich verdoppeln
> 1 -> Kategorie 1
> 2 -> Kategorie 2
> 4 -> Kategorie 3
> 8 -> Kategorie 4
> 16-> Kategorie 5


Also letztendlich ein Bit pro Kategorie.

> In Angebote ist der kumulierte Wert erfasst (also z.B. 20 wenn das
> Angebot in Kategorie 4 und 5 erscheinen soll,


Wohl eher 3 und 5 :-)

> oder 21 wenn es in
> Kategorie 1+3+5 erscheinen soll).
> Was ich nun suche ist ein Lösungsansatz um bei übergabe der Zahl 21
> wieder die Einzelwerte auszugeben um auf diese Summe zu kommen.


Schau Dir mal die Bitoperatoren an.

Gruß. Claus
Stefan Dreyer (29.09.2009, 13:30)
Stefan Froehlich wrote:
> On Tue, 29 Sep 2009 12:01:27 Andreas Gräber wrote:
> Zaehler initialisieren.
> Die Zahl Halbieren, in ganzzahligen Anteil und Rest trennen. Abhaengig vom
> Rest (0 oder 0.5) ist die entsprechende Kategorie vorhanden oder nicht.
> Zaehler hochzaehlen, das ganze in eine Schleife packen und mit dem
> ganzzahligen Anteil als neue Zahl weitermachen. Fertig bist Du, sobald der
> ganzzahlige Anteil 0 ist.


Wenn Du schon einen Zähler benutzt, würde ich aber lieber ein bitweises
UND benutzen. Das sollte performanter sein, als die Division und
Rundungsfunktionen. Man muss sich nur Gedanken über die Abbruchfunktion
machen.
Stefan Froehlich (29.09.2009, 14:09)
On Tue, 29 Sep 2009 13:30:28 Stefan Dreyer wrote:
> Wenn Du schon einen Zähler benutzt, würde ich aber lieber ein bitweises
> UND benutzen. Das sollte performanter sein, als die Division und
> Rundungsfunktionen. Man muss sich nur Gedanken über die Abbruchfunktion
> machen.


Oder natuerlich gleich decbin(), aber ich habe irgendwie ein Faible
fuers bodenstaendige (das laesst sich dann auch einfacher in anderen
Sprachen abbilden).

Zeitkritische sollte _sowas_ in einem PHP-Programm eigentlich nicht
sein, egal wie es geloest wird.

Servus,
Stefan
Thomas Hamacher (29.09.2009, 20:34)
Andreas Gräber schrieb:

> Es gibt 2 Tabellen
> Kategorien
> ----------
> kategorie_id
> kategorie_name
> Angebote
> --------
> angebot_id
> ...
> kategorie


> Die kategorien sind so angelegt daß die IDs sich verdoppeln
> 1 -> Kategorie 1
> 2 -> Kategorie 2
> 4 -> Kategorie 3
> 8 -> Kategorie 4
> 16-> Kategorie 5


> In Angebote ist der kumulierte Wert erfasst (also z.B. 20 wenn das
> Angebot in Kategorie 4 und 5 erscheinen soll, oder 21 wenn es in
> Kategorie 1+3+5 erscheinen soll).


> Was ich nun suche ist ein Lösungsansatz um bei übergabe der Zahl 21
> wieder die Einzelwerte auszugeben um auf diese Summe zu kommen.


Wenn du das sowieso in Tabellen hast und es das RDBMS machen lässt, dann
ist es recht einfach:

SELECT k.*
FROM angebote a
JOIN kategorie ON a.kategorie & k.kategorie_id
WHERE a.angebot_id = :angebot_id

(MySQL)

Ob es generell eine gute Idee ist die Daten derart zu verknüpfen
bezweifel ich jedoch.

VG
Thomas
Niels Braczek (29.09.2009, 21:57)
Andreas Gräber schrieb:

> Die kategorien sind so angelegt daß die IDs sich verdoppeln
> 1 -> Kategorie 1
> 2 -> Kategorie 2
> 4 -> Kategorie 3
> 8 -> Kategorie 4
> 16-> Kategorie 5


> In Angebote ist der kumulierte Wert erfasst (also z.B. 20 wenn das
> Angebot in Kategorie 4 und 5 erscheinen soll, oder 21 wenn es in
> Kategorie 1+3+5 erscheinen soll).


Also binäre Flags.

> Was ich nun suche ist ein Lösungsansatz um bei übergabe der Zahl 21
> wieder die Einzelwerte auszugeben um auf diese Summe zu kommen.


// $category sei der kumulierte Wert
$catids = array();
for ( $i=0; $i<8; $i++ ) {
$flag = 1<<$i;
if ( ($category & $flag) == $flag ) {
$catids[] = $flag;
}
}
// $catids enthält die Einzelwerte

Die 8 ist relativ willkürlich gewählt. Wenn deine höchste "id" 16 ist,
reicht hier die 5 (wg 2^5-1 = 31 = 16+8+4+2+1).

MfG
Niels
Ähnliche Themen