Ich könnte diesen einen möglicherweise alleine knacken, aber mein Verstand fragt sich nach Brexit, also beschloss ich, diese netten Leute zu fragen. Ich habe dieses Array (oder SQL Ergebnisse) von Hardware-Optionen:php array in kombinationen
cId cName vId vName
1 Processor 679 3.5GHz 6-Core
1 Processor 680 3.0GHz 8-Core
1 Processor 681 2.7GHz 12-Core
2 Memory 682 16GB
2 Memory 683 32GB
2 Memory 684 64GB
5 HDD 685 256GB
5 HDD 686 512GB
5 HDD 687 1TB
11 Graphics 688 D500 with 3GB
11 Graphics 689 D700 with 6GB
und ich bin auf der Suche nach dem effektivstenen Weg, um alle Kombinationen von Optionen zur Liste, beginnend mit
3.5GHz 6-Core, 16GB, 256GB, D500 with 3GB
und endend mit
2.7GHz 12-Core, 64GB, 1TB, D700 with 6GB
was ist, glaube ich, 54 Zeilen. Gibt es einen schnellen Weg mit PHP?
Oder in MySQL. Die Eingabedaten sind tatsächlich in zwei Tabellen - eine Tabelle hat Kategorie-IDs und Namen, und eine andere hat Kategorie-IDs, Wert-IDs und Wertnamen (es gibt natürlich auch Modell-IDs für andere Computer, aber lasst uns einfach bleiben mit diesem Mac Pro für jetzt).
Edit: Bitte beachten Sie dass die Anzahl der Hardware-Kategorien ist flexible - zB ein MacBook nur Speicher und HDD Optionen haben könnten. Die Anzahl der Kategorien sollte nicht begrenzt sein.
Das ist viel allgemeineren Eingang:
c1 = array (v1, v2)
c2 = array (v3, v4, v5)
wo die Zahl der beiden Kategorien oder Werte innerhalb einer Kategorie, flexibel ist. Das ist also das Ergebnis, sechs Kombinationen von Werten:
c1 v1, c2 v3
c1 v1, c2 v4
c1 v1, c2 v5
c1 v2, c2 v3
c1 v2, c2 v4
c1 v2, c2 v5
Wenn ich eine weitere Kategorie hinzufügen
c5 = array (v6, v7)
wird es zwölf Kombinationen sein:
c1 v1, c2 v3, c5 v6
c1 v1, c2 v3, c5 v7
c1 v1, c2 v4, c5 v6
c1 v1, c2 v4, c5 v7
c1 v1, c2 v5, c5 v6
c1 v1, c2 v5, c5 v7
c1 v2, c2 v3, c5 v6
c1 v2, c2 v3, c5 v7
c1 v2, c2 v4, c5 v6
c1 v2, c2 v4, c5 v7
c1 v2, c2 v5, c5 v6
c1 v2, c2 v5, c5 v7
Die SQL-Daten
sind in zwei Tabellen. Die erste beschreibt, welche Hardware-Kategorien für bestimmtes Computermodell verfügbar sind:
modelID catID name
1 1 Processor
1 2 Memory
2 1 Processor
so hier das Computermodell 2 hat nur eine Option - verschiedener Prozessor.
Tabelle zwei beschreibt, welche Optionen verfügbar sind (optID ist einzigartig):
modelID catID optID name
1 1 1 i3
1 1 2 i5
1 2 3 4GB
1 2 4 8GB
1 2 5 16GB
2 1 6 i3
2 1 7 i5
2 1 8 i7
Also hier haben wir einen Computer mit sechs verschiedenen Kombinationen haben kann, und zum anderen mit drei. Was ich als Ausgabe brauche, ist eine Sequenz der Kombinationen, weil ich eine API für eine SKU und den Preis dieser Kombinationen abfrage. Die Abfrage wird so etwas wie:
wählen Modell modelID und Daten zurückgesetzt (zB modelID = 1?)
wählen catID und optID (zB?modelID = 1 & catID = 1 & optID = 1 Prozessor Auswahl: i3)
wiederholen 2 für alle verfügbaren Kategorien (also hier noch einmal mit Speicher: 4 GB)
Abfrage der SKU und Preis (so jetzt wäre es Ergebnisse für i3 erhalten, 4 GB)
Wiederholung von 1 für alle Kombinationen für dieses Modell - sechs mal für modelID 1 und dreimal für modelID 2.
Dies würde die gesamte Liste der Anträge auf meine Tabelle oben sein:
select?modelID=1
choose?modelID=1&catID=1&optID=1
choose?modelID=1&catID=2&optID=3
price?
select?modelID=1
choose?modelID=1&catID=1&optID=1
choose?modelID=1&catID=2&optID=4
price?
select?modelID=1
choose?modelID=1&catID=1&optID=1
choose?modelID=1&catID=2&optID=5
price?
select?modelID=1
choose?modelID=1&catID=1&optID=2
choose?modelID=1&catID=2&optID=3
price?
select?modelID=1
choose?modelID=1&catID=1&optID=2
choose?modelID=1&catID=2&optID=4
price?
select?modelID=1
choose?modelID=1&catID=1&optID=2
choose?modelID=1&catID=2&optID=5
price?
select?modelID=2
choose?modelID=2&catID=1&optID=6
price?
select?modelID=2
choose?modelID=2&catID=1&optID=7
price?
select?modelID=2
choose?modelID=2&catID=1&optID=8
price?
Das Ergebnis neun SKUs mit den Optionen in einem Array gespeichert sein würde.
result = array (
sku, price, modelID, array (catID => optID)
)
Rekursion ist wahrscheinlich der Weg zu gehen, da die Anzahl der Iterationen unsicher ist. Ich habe hier this article gefunden, was ein größerer Kandidat für ein Duplikat ist, aber ich habe meine Lösung immer noch nicht bekommen. Ich werde wahrscheinlich die Kombinationen manuell machen müssen.
Epilog
Schließlich war die Verbindung über sehr hilfreich, über Rekursion, aber es war alles tun, nicht ich wollte. Und an diesem Punkt wurde mir klar, dass ich nicht immer alle Kombinationen brauche - die API merkt sich die Position von catID, also muss ich nur die ändern, die ich muss. Und es bedeutet auch, wenige Anrufe (22 vs 33) an die API:
select?modelID=1
choose?catID=1&optID=1
choose?catID=2&optID=3
price?
choose?catID=2&optID=4
price?
choose?catID=2&optID=5
price?
choose?catID=1&optID=2
choose?catID=2&optID=3
price?
choose?catID=2&optID=4
price?
choose?catID=2&optID=5
price?
select?modelID=2
choose?catID=1&optID=6
price?
choose?catID=1&optID=7
price?
choose?catID=1&optID=8
price?
Und das ist der Code:
<?php
function possibilities($input) {
$current = array_shift($input);
foreach ($current['optID'] as $optid) {
echo "choose?catID=", $current['catID'], "&optID=", $optid, PHP_EOL;
if (empty($input)) {
echo "price?", PHP_EOL, PHP_EOL;
} else {
possibilities($input);
}
}
}
$models[] = array(
'modelID' => 1,
'options' => array(
array('catID' => 1, 'optID' => array(1, 2)),
array('catID' => 2, 'optID' => array(3, 4, 5))
)
);
$models[] = array(
'modelID' => 2,
'options' => array(
array('catID' => 1, 'optID' => array(6, 7, 8))
)
);
foreach ($models as $model) {
echo "select?modelID=", $model['modelID'], PHP_EOL, PHP_EOL;
possibilities($model['options']);
}
?>
So war ich in der Lage, alle Preise in einer Tabelle zu erhalten. Und ich musste es für alle Optionen in einer Tabellenzeile erneut analysieren. Ich bin mir sicher, dass es Leute gibt, die nicht nur wissen, wie man es in einem Schritt macht, sondern auch die Kombinationen sortiert, um ein Minimum an API-Calls zu erreichen.
Vier foreach - macht es – splash58
Können Sie teilen, was Sie versucht haben? Bitte lesen [wie man Fragen zu StackOverflow stellt] (http://stackoverflow.com/help/how-to-ask) –
löst meine Antwort Ihr Problem? – JRsz