Geringste Zahlendifferenz zwischen meheren Zahlenarrays?

@yaslaw

Respekt! Deines macht es FAST richtig:

array(4) {
["v0"]=>
string(4) "6871" <<== Wieso der große wert?!
["v1"]=>
string(4) "7023"
["v2"]=>
string(1) "1"
["diff"]=>
string(5) "14044"
}

Aber wie machst du das nun genau? Und ich kann da so viele Array angeben wie möglich?!
 
Leider ist das ja falsch, weil nun theoretisch folgendes kommen muss:
Zitat:
Array ( [0] => 5499 [1] => 7023 [2] => 1)
Naja wenn bei dir 1524 < 48 ist dann muss ich dir wohl recht geben.
Die Tatsache das meins nur 2 Ergebnisse zurück liefert liegt daran das ich davon ausgegangen bin das du in n-Arrays das Paar ( = 2 Werte ) mit der kleinsten Differenz suchst.
 
@Yaslaw
Aber wie machst du das nun genau? Und ich kann da so viele Array angeben wie möglich?!

Also. Die Grundiedee ist die. Mit SQL kann man einfacher mit Datenmengen arbeiten als mit PHP. Jeder der schon mal 2 oderer mehrere Tabellen in ein SQL eingebunden hat ohne sie zu verknüpfen, der weiss dass SQl dann alle möglichen Kombinationen ausgibt. Genau dieser Effekt wollte ich nutzen.

Schritt 1: Wir haben keine Tabelle sondern array. Also, wie bringe ich die Daten ohne Tabellen in eine Tabellenform für SQL?
Dazu verwende ich den Union.
SQL:
SELECT 123 AS v1 UNION SELECT 456 AS v1 UNION SELECT 789 AS v1
Das ergibt eine Tabelle die so aussieht
Code:
v1
---
123
456
789
Pro Array in $speed erstelle ich also ein solches SQL.

Schritt 2: Die SQLs zusammenfügen. Dadurch werden alle möglichen Kombinationen erstellt. Das geht mit beliebig vielen SQls (man muus pro SQL im Select-Teil ein Feld definieren!)
SQL:
SELECT t1.v1, t2.v2
FROM
      (SELECT 123 AS v1 UNION SELECT 456 AS v1 UNION SELECT 789 AS v1) t1,
      (SELECT 135 AS v2 UNION SELECT 246 AS v2 UNION SELECT 543 AS v2) t2

Das ergibt dann
Code:
 v1 | v2
123 | 135
456 | 135
789 | 135
123 | 246
456 | 246
789 | 246
123 | 543
456 | 543
789 | 543

Schritt 3: Die differenz bilden.
Die Differenzen bilde ich nun indem ich die absoluten Differnenzen aller möglichen Feldkombinationen summiere. Ob diese Formel so richtig ist, muss geprüft werden.
SQL:
#für 3 SQls (oder drei EInträgen in $speed)
abs(v1-v2) + abs(v1-v3) + abs(v2-v3) AS diff

Schritt 4: Sortieren. Das ganze noch aufsteigend nach der Differenz sortieren, damit die kleinste zuerst kommt. Ich mache extra kein LIMIT, da mehrere Kombinationen gleich grosse Differenzen haben können.
SQL:
ORDER BY diff

Schritt 5: PHP! Fertig mit SQL-THeorie, jetzt wird dieses SQL generisch in PHP erstellt! Das ist der eigentliche PHP-Code.....
5.1: SQL generisch erstellen
5.2: SQL über die DB auswerten lassen
5.3: Alle Datensätze mit der kleinsten Differenz ausgeben.
 
Zuletzt bearbeitet von einem Moderator:
Zurück