2016-06-24 17 views
0

私はこのことを単独でも犯すことができましたが、私の心はBrexitの後で不思議に思っていました。php array into combination

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 

と私はオプションのすべての組み合わせを一覧表示するための最も効果的な方法を探しています、

3.5GHz 6-Core, 16GB, 256GB, D500 with 3GB 

で始まり、

で終わる:私は、ハードウェアオプションのこの配列(またはSQLの結果を)持っています
2.7GHz 12-Core, 64GB, 1TB, D700 with 6GB 

これは、私が考えると54行です。 PHPはすぐに使えますか?

またはMySQLで。入力データは、実際には2つのテーブルにあります.1つのテーブルにはカテゴリIDと名前があり、別のテーブルにはカテゴリID、値ID、および値の名前があります(もちろん、別のコンピュータのモデルIDもありますが、このMac Proは現在使用しています)。

編集: - などのMacBook専用メモリとHDDの選択肢を持つことができ、ハードウェアカテゴリの数が柔軟あるますのでご注意ください。カテゴリの数に制限はありません。

これは入力はるかに一般化である:

両方のカテゴリ、またはカテゴリ内の値の数は、柔軟である
c1 = array (v1, v2) 
c2 = array (v3, v4, v5) 

。これは、結果である値の6つの組み合わせ:

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 

SQLデータ

:私は1つの以上のカテゴリ

c5 = array (v6, v7) 

を追加すると

c1 v1, c2 v3 
c1 v1, c2 v4 
c1 v1, c2 v5 
c1 v2, c2 v3 
c1 v2, c2 v4 
c1 v2, c2 v5 

12個の組み合わせが存在します

は2つのテーブルにあります。最初のものは、ハードウェアのカテゴリが与えられたコンピュータモデルのために利用可能な説明:

modelID catID name 
1  1  Processor 
1  2  Memory 
2  1  Processor 

ので、ここでは、コンピュータモデル2は、一つだけのオプション有する - 異なるプロセッサ。

表2は、(optIDが一意である)が利用可能であるオプションについて説明します。

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 

そこでここでは、6つの異なる組み合わせであるコンピュータを持っている、そして3と他のことができます。私が出力として必要とするのは、SKUのAPIとこれらの組み合わせの価格を照会するため、組み合わせのシーケンスです。クエリのようなものになります。

  1. 選択モデルmodelIDとデータをリセット(?例えばmodelID = 1)

  2. は、例えば(CATIDとoptIDを選ぶのか?modelID = 1 & CATID = 1 & optID = 1プロセッサを選択されていますので、ここで一度、より多くのメモリを持つすべての利用可能なカテゴリ(用I3)

  3. 繰り返し2:4GB)

  4. クエリSKUと価格(そうmodelID 1のための6回と3回modelID 2の

- 今では、i3の結果、4ギガバイト)このモデルのすべての組み合わせについて、1から

  • 繰り返しになるだろうこれは上記の私のテーブルの要求の一覧です:

    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? 
    

    結果は、オプションで配列に格納されている9つのSKUになります。

    result = array (
        sku, price, modelID, array (catID => optID) 
    ) 
    

    反復の回数が不確実であるため、再帰が最も一般的です。私はthis articleを見つけましたが、それは重複したものの大きな候補ですが、私はまだ解決策を得ていませんでした。私はおそらく、手動で組み合わせをしなければならないでしょう。

    エピローグ

    は、最終的には、上記のリンクは再帰について非常に有用だったが、それは私が望んでいたすべてのものをやっていませんでした。そしてその時点で、私はいつもすべての組み合わせを必要としないことに気付きました.APIはcatIDの位置を記憶しているので、必要なものだけを変更する必要があります。

    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? 
    

    をそして、これはコードです::そしてそれはまた、APIに以下の呼び出し(33対22)を意味

    <?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']); 
    } 
    ?> 
    

    は、だから私は、テーブル内のすべての価格を取得することができました。テーブル行のすべてのオプションについてもう一度解析する必要がありました。私は1つのステップでそれを行う方法だけでなく、組み合わせをソートしてAPIコールの合計を最小限にする方法を知っている人がいると確信しています。

  • +0

    4つのforeach - それになります – splash58

    +0

    あなたが試したことを共有することはできますか? [StackOverflowで質問する方法](http://stackoverflow.com/help/how-to-ask) –

    +0

    私の答えはあなたの問題を解決しますか? – JRsz

    答えて

    -2

    あなたの質問が非常に変更された後、私は別の解決策を考え出しましたが、失敗しました。私はこのようなものを作り出そうとしました。いくつかのバージョンの後、私はこれに来ました:

    $allCombinations = array(); 
    
    $yourDB1[0] = array("modelID" => 1, "catID" => 1,"name" => "Processor"); 
    $yourDB1[1] = array("modelID" => 1, "catID" => 2,"name" => "Memory"); 
    $yourDB1[2] = array("modelID" => 2, "catID" => 1,"name" => "Processor"); 
    
    $yourDB2[0] = array("modelID" => 1, "catID" => 1, "optID" => 1, "name" => "i3"); 
    $yourDB2[1] = array("modelID" => 1, "catID" => 1, "optID" => 2, "name" => "i5"); 
    $yourDB2[2] = array("modelID" => 1, "catID" => 2, "optID" => 3, "name" => "4GB"); 
    $yourDB2[3] = array("modelID" => 1, "catID" => 2, "optID" => 4, "name" => "8GB"); 
    $yourDB2[4] = array("modelID" => 1, "catID" => 2, "optID" => 5, "name" => "16GB"); 
    $yourDB2[5] = array("modelID" => 2, "catID" => 1, "optID" => 6, "name" => "i3"); 
    $yourDB2[6] = array("modelID" => 2, "catID" => 1, "optID" => 7, "name" => "i5"); 
    $yourDB2[7] = array("modelID" => 2, "catID" => 1, "optID" => 8, "name" => "i7"); 
    
    $allModels = array(); 
    $sizeDB1 = count($yourDB1); 
    $sizeDB2 = count($yourDB2); 
    
    for($i = 0; $i < $sizeDB2; $i++) 
    { 
        $allModels[$yourDB2[$i]["modelID"]][] = $yourDB2[$i]; 
    } 
    
    $models = array_unique(array_keys($allModels)); 
    $amountModels = count($models); 
    
    for($i = 0; $i < $amountModels; $i++) 
    { 
        $amountCatIDs = count($allModels[$models[$i]]); 
    
        $allCat = array(); 
        for($j = 0; $j < $amountCatIDs; $j++) 
        { 
         $allCat[$allModels[$models[$i]][$j]["catID"]][] = 1; 
        } 
    
        $amountCat = count($allCat); 
        $cat = array_key($allCat); 
        for($j = 0; $j < $amountCat; $j++) 
        { 
         //Here it is tricky because of multiple possible options of hardware 
        } 
    } 
    

    私は結論に達したので、別の構造が役立つでしょう。それは構造を変更するオプションですか?もしそうなら、私は

    Model Table: 
    
    modelID cpuIDs ramIDs hdIDs gpuIDs 
    1   2,5  1,2,3 1  1,2 
    2   2,5  1,2  1,2,4 2,3 
    3   3,6  2,3  2,3  1,3 
    
    CPU Table: 
    
    cpuID name Specs  Other 
    1  i3  2,0 GHz 5. generation 
    2  i3  1,9 GHz 4. generation 
    3  i5  2,5 GHz 4. generation 
    

    のような構造を勧めます。これは、あなたに適している場合は、多くのお手伝いをします。 あなたの状況に対する解決策がありますが、それは自明ではなく、特に維持が難しいと思います。データベースを整理すると、長期的には多くの問題を解決できますが、これを見つけることも簡単なことではありません。

    また、すべてのモデルには、選択できない場合は各種類のデフォルトハードウェアが必要です。これは、私が作業を停止した問題を解決するコード内のコメントを参照してください

    +0

    ありがとうございました。残念なことに、このリストは非常にダイナミックであると言わざるをえませんでした。たとえば、いくつかのラップトップでは2つのメモリ構成を選択できますが、6つの異なるサイズのHDがあります。 –

    +0

    あなたのアレイのフォーマットはどういうものですか?それから私は完全に動的なコードをいくつか与えることができますが、私は出発点(構造)が必要です。それは二次元の配列ですか、数値か連想ですか、上のような形式のデータベースですか?どの形式が望ましい出力ですか? – JRsz

    +0

    クール、ありがとうございます。元のデータは2つのテーブルです。私は説明を更新します。 –