2

いくつかのコスト情報を調べていて、すべての組み合わせを表示する適切な方法が必要です。ネストされたforeachループなどを使用する必要があるかどうかはわかりません。

私は25種類のアイテムを持っています。item1 - item2 .. item 25

アイテムの構築に使用するボルトが 6 本あります。ボルト1 -ボルト2 -ボルト3 -ボルト4 -ボルト5 -ボルト6各ボルトのコストは異なります。

すべてのアイテムで使用できるボルトは1種類のみです。ボルト 1 の 3 とボルト 2 の 3 のような混合物ではありません。

  • 25 項目中 7 項目で 6 本のボルトが必要です。
  • 残りの 6 つには 5 本のボルトが必要です。
  • 残りの 3 つには 4 つのボルトが必要です。
  • 残りの 5 つには 3 つのボルトが必要です。
  • 残りの 3 つには 2 つのボルトが必要です。
  • 最後の 1 つには 1 つのボルトが必要です。

ここがややこしいところです。

ボルトの数を持つ各アイテムには、異なるコストを持つ 4 つのアクセサリ パックのいずれかが必要です。

acc1 - acc2 - acc3 - acc4

各アイテムには、4 つのボックス スタッファーのうちの 1 つが必要です。それぞれ、異なるコストで

スタッフィー1 -スタッフィー3 -スタッフィー3 -スタッフィー4

最後に、各アイテムには 3 つのラッパーのいずれかが必要です。それぞれ、異なるコストで。

ラッパー1 -ラッパー2 -ラッパー3

たとえば、考えられるすべての価格の組み合わせを提供するには、PHP が必要です。

foreach 6 bolt item{
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer1Cost + $wrapper1Cost) = item1acc1stff1wra1COST
(6 bolt1 * $cost) +  ($acc2Cost + $stuffer1Cost + $wrapper1Cost) = item1acc2stff1wra1COST
(6 bolt1 * $cost) +  ($acc3Cost + $stuffer1Cost + $wrapper1Cost)  ..
(6 bolt1 * $cost) +  ($acc4Cost + $stuffer1Cost + $wrapper1Cost)  ..
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer2Cost + $wrapper1Cost)  ..
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer3Cost + $wrapper1Cost)
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer4Cost + $wrapper1Cost)
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer1Cost + $wrapper2Cost)
(6 bolt1 * $cost) +  ($acc1Cost + $stuffer1Cost + $wrapper3Cost)
(6 bolt2 * $cost) +  ($acc1Cost + $stuffer1Cost + $wrapper3Cost)
(6 bolt2 * $cost) +  ($acc1Cost + $stuffer1Cost + $wrapper3Cost)
..... all combinations
foreach 5 bolt item{
(5 bolts * $cost) +  (**$acc1Cost** + **$stuffer1Cost** **$wrapper1Cost**)
(5 bolts * $cost) +  (**$acc2Cost** + **$stuffer1Cost** **$wrapper1Cost**)
(5 bolts * $cost) +  (**$acc3Cost** + **$stuffer1Cost** **$wrapper1Cost**)
(5 bolts * $cost) +  (**$acc4Cost** + **$stuffer1Cost** **$wrapper1Cost**)

..so on to the end..
}

各タイプのアイテムは、必要なボルトの数によって分割された異なる配列に分類されます。

$oneBolt = array(
bolt1 => cost,
...
);

他の各アイテム グループは、それぞれの価格配列に保持されます。

上記のようにすべての組み合わせを書き出すことができることはわかっていますが、ループでこれを行うにはどうすればよいですか? 何らかの方法でそれを行うのは賢明ですか?PHPには、このようなもののための組み込み関数がありますか? どうぞ、あなたが提供できる洞察をいただければ幸いです。これを行うべき別の方法はありますか?

4

3 に答える 3

2

あなたが提案したように、配列を使用してそれを行う方法を見てみましょう。多次元配列を使用するので、価格以外に各パーツに関する詳細情報(名前、プロバイダー、URLなど)を保存できます。

$bolts = array();
$bolts[1] = array('price'=> 25);
$bolts[2] = array('price'=> 12);
$bolts[3] = array('price'=> 45);
$bolts[4] = array('price'=> 33);
$bolts[5] = array('price'=> 32);
$bolts[6] = array('price'=> 31);

$accessories = array();
$accessories[1] = array('price'=> 140);
$accessories[2] = array('price'=> 120);
$accessories[3] = array('price'=> 134);
$accessories[4] = array('price'=> 136);

$stuffer = array();
$stuffer[1] =array('price'=> 12);
$stuffer[2] =array('price'=> 12);
$stuffer[3] =array('price'=> 12);
$stuffer[4] =array('price'=> 12);

$wrapper = array();
$wrapper[1] =array('price'=> 12);
$wrapper[2] =array('price'=> 12);
$wrapper[3] =array('price'=> 12);

$items = array();
$items[1] = array('bolt'=> 3, 'bolt_amount'=>7, 'accessory'=>2, 'stuffer'=>4, 'wrapper'=>2);
// Do that for 25 items, each item is an array containing its relationships. Store the Index of the part in its own array so you can reference it when calculating the price.

$items[1]['price'] = ($items[1]['bolt_amount'] * $bolts[$items[1]['bolt']]['price']) + $accessories[$items[1]['accessory']]['price'] + $stuffer[$items[1]['stuffer']]['price'] + $wrapper[$items[1]['wrapper']]['price'];

echo $items[1]['price'];

// 7*45 + 120 + 12 + 12 = 459

それは、それを書くための最も簡単な、しかし維持可能な方法についてです。

于 2012-08-11T23:44:10.487 に答える
2

あなたの問題は、実際のプログラミングよりもコンテンツモデリングに関するものだと思います。

これらの関係を格納するために mysql データベースを使用することを検討しましたか? アイテム用に 1 つのテーブル、ボルト用に 1 つのテーブル、アクセサリ用に 1 つのテーブル、詰め物用のテーブル、ラッパー用のテーブルが 1 つずつあります。

次に、各オブジェクト間の関係を定義する必要があります。

  • 1 対 1 : 例: 「1 人の人間を 1 組の目として。1 組の目は 1 人の人間にのみ属することができます」
  • 1 対多: 例: 「人間は 1 つの家族しか持てない」
  • 多対 1 : 例: 「家族は多くの人間を持つことができます。」
  • 多対多 : 例: 「レシピには多くの材料を含めることができます。材料には多くのレシピを含めることができます」

だから、あなたの場合:

アイテム / ボルトの関係は : 多対 1 アイテム / アクセサリーは : 1 対 1 (afaik) などです。

それをセットアップしたら、「ビジネス ロジック」を実装するミドルウェア コード (たとえば、php) を生成する必要があります。制限が尊重されていることを確認し、これらの制限に従って各アイテムの価格を計算します。

私はあなたを全く違う方向に連れて行くことであなたの要求に答えていることを理解していますが、それが私のやり方です. MVC フレームワークを使用して開発を高速化します (cakephp、yii、codeigniter など)。この方法論についてさらに情報が必要な場合はお知らせください。

于 2012-08-11T23:21:07.177 に答える
0

pixeline が書いたように、データベースを使用する方が良いでしょう。しかし、配列を使用したい場合は、役立つはずのコードを数行書きました。

// make combinations array
function combinations($data, &$all = array(), $group = array(), $val = null, $i = 0) {
    if (isset($val))
    {
        array_push($group, $val);
    }

    if ($i >= count($data))
    {
        $combination_price = array_product($group);
        array_push($all, array('combination' => $group, 'combination_price' => $combination_price));
    }
    else {
        foreach ($data[$i] as $v)
        {
            combinations($data, $all, $group, $v, $i + 1);
        }
    }

    return $all;
}

$bolts = array(
    25, // bolt 1 price
    30, // bolt 2 price
    40  // bolt 3 price
);

// array of items contains number of bolts and price
$items = array (
    array(
        'bolts_num' => 6,
        'bolt_price' => $bolts[0]
    ), 
    array(
        'bolts_num' => 6,
        'bolt_price' => $bolts[1]
    ), 
    array(
        'bolts_num' => 6,
        'bolt_price' => $bolts[2]
    ),  
);

$accessories = array(
    12, 16, 18, 20 //accessories prices
);

$stuffers = array(
    20, 10, 30, 40  //stuffers prices
);

$wrapper = array(
    11, 13, 17  //wrapper prices
);

// all combinations, use var_dump if you dont know what is inside
$combinations = combinations(array($accessories, $stuffers, $wrapper));

$item_combinations = array();

// join combinations and items and calculate final price
foreach ($items as $item_key => $item) {
    foreach($combinations as $combination) {
        $item_price = array_product($item);
        $item_combinations[] = array(
            'item_id' => $item_key,
            'combination' => $combination['combination'],
            'price' => $combination['combination_price'] + $item_price
        );
    }
}

var_dump($item_combinations);

私達がすること:

  1. すべてのアクセサリ - スタッファ - ラッパーの組み合わせを作成し、すべての組み合わせ (アクセサリ * スタッファ * ラッパー) の価格を計算します。array_product 関数を使用しました。
  2. 組み合わせとアイテムを結合します。各アイテムの価格 (ボルト * 数) を計算し、組み合わせ価格に追加しました。商品価格を忘れたので、商品価格も追加してください。

ご不明な点がございましたら、お問い合わせください。

実際に見てください:http://codepad.viper-7.com/8fsVp6

于 2012-08-12T00:22:38.207 に答える