Denkanstoß in Sachen Array-Vergleich benötigt

droni

Erfahrenes Mitglied
Hallo,

ich will/muß so eine Art Tarif-Konfigurator basteln.

Es gibt einen Grundtarif, und dann halt Erweiterungen dazu. Sprich verschiedene Tarife mit zusätzlichen Features. Jetzt kommt es halt überwiegend vor, dass einige Features in mehreren Tarifen vorkommen. Da soll mein Script zum Einsatz kommen.

Ich wollte eine Eingabemaske erstellen, wo alle Features aufgelistet sind. Dann kann der Kunde auswählen was er haben möchte. Als ergebnis soll er angezeigt bekommen, welcher Tarif für ihn geeignet ist. Falls es den Tarif nicht gibt, soll der Tarif mit den meisten Treffern (und eine Liste mit den fehlenden Features die er zusätzlich nehmen muss) angezeigt werden.

Soweit zur Theorie.

Ich habe eine Tabelle in der Datenbank in der die Tarife stehen. Die Features stehen in einem String. (z.B. 00111001). Jede Zahl steht für ein Feature. 0 bedeutet ist in dem Tarif nicht mit drin, bei einer 1 ja.

Ich habe mir jetzt überlegt, dass ich via while Schleife einzeln nach den vom Eingabeformular übergebenen Features suche und jedes mal das Ergebnis in ein Array schreibe. Je mehr wünsche der Kunde hat, desto mehr Array würden entstehen. In dem Array steht dann die ID des Tarifes, in dem das Feature enthalten ist.

Bis hierhin alles kein Problem.
Und nun stoßen wir auf mein Problem. Jetzt wollte ich überprüfen lassen, wie oft in den ganzen Arrays die gleiche ID vorkommt. Die ID mit den meisten Treffern hat gewonnen.

Ich muss also die ganzen Array’s miteinander vergleichen und den Inhalt auf Gleichheit überprüfen und wissen welche ID am meisten vorkommt. Könnte ja auch alles in ein Array knallen. Da gibt es ja die Funktion dass er alles was doppelt dreifach ist, bis auf einen rauslöscht. Wäre ja schon mal toll, aber dann weiß ich immer noch nicht wie oft das passiert ist. *grummel*

Hat da vielleicht jemand eine Idee?
Falls es anders noch besser Funktioniert wäre ich für Anregungen dankbar. Da das meiste noch in den Anfängen steht, könnte ich selbst die DB noch mal komplett umwerfen. Aber ich glaube, dass ich zumindest auf dem richtigen Weg bin.

Vielen Dank

MfG
droni
 
Das kannst du auch ohne PHP ermitteln...ein bisserl was kann MySQL ja auch ;)

Code:
SELECT features
FROM `tabelle`
GROUP BY features
ORDER BY count( * ) DESC
LIMIT 1
 
Hallo,

verstehe ich jetzt nicht ganz.

In der DB steht z.B.

011001101
000001101
001000001


als Feature Strings.

Der String der durch das Eingabeformular entsteht würde (weil nicht alle Features angeklickt wurden) 011001100 lauten. Der gewünschte Tarif ist nicht vorhanden, aber der erst genannte käme am nächsten ran. Hat halt ein Feature mehr. Aber da die anderen 4 stimmen, soll er den ersten rausschmeißen.

Wie würdest du das in deinem Befehl umsetzen?

MfG
droni
 
Ich würde dir raten die Datenbank umzubauen. Pro Feld eine Info. Dann kannst du nämlich auch das oben genannte SQL Statement auf die Datenbank loslassen.
 
Der Umbau wäre kein Problem.

Nur mit dem Befehl komme ich immer noch nicht klar. Wie übergebe ich da denn
die einzelnen Features?
 
Sorry, ich hatte das wohl falsch verstanden :-(

Also angenommen, der Kunde bestellt das 2. und das 6. Feature...dann könnte die Abfrage so aussehen:

Code:
SELECT id,features,(substring(features,2,1)+substring(features,6,1)) as summe
FROM `tabelle`
order by (substring(features,2,1)+substring(features,6,1)) desc
...es werden halt die Ziffern an den entsprechenden Stellen addiert und nach dieser Summe sortiert.
 
Nö, welche Features gewünscht werden, entscheidet ja der Kunde....daraus kannst du die Abfrage dynamisch erstellen:
Code:
<?php
  //$_POST['requested_features']=array(2,6,8);
  
  $args='(substring(features,'.implode(',1)+substring(features,',$_POST['requested_features']).',1))';
  $sql='SELECT id,features,'.$args.' as summe FROM `tabelle` order by '.$args.' desc';
  mysql_query($sql);
?>
 
Jo.. verstehe was du meinst.

Nur leider hat die Sache noch einen Schönheitsfehler.

Angenommen in der Datenbank steht folgendes:

Tarif1 111110
Tarif2 111000
Tarif3 111111

Der Kunde wünscht sich: 110000

Dann schmeißt er trotzdem Tarif1 raus, da ja die Kriterien zutreffen. Nur leider ist da auch zuviel bei. Tarif2 wäre hier die bessere Wahl.

*verzweifel*
 
Ich hab einen Lösungsvorschlag auf Datenbankebene: Speichere die Bitmuster als Ganzzahlen. Bei den genannten Daten wäre das beispielsweise:
Code:
+--------+------+
| id     | data |
+--------+------+
| Tarif1 | 62   |
| Tarif2 | 56   |
| Tarif3 | 63   |
+--------+------+
Die Abfrage mit dem Vergleichswert 48 (entspricht „110000“) zur Ermittlung der kleinsten gemeinsamen Übereinstimmung wäre dann:
Code:
mysql> SELECT * FROM `binary` ORDER BY `data` & 48 DESC, BIT_COUNT(`data`) ASC;
+---------+------+
| id      | data |
+---------+------+
| Tarif2  | 56   |
| Tarif1  | 62   |
| Tarif3  | 63   |
+---------+------+
 
Zurück