我有一个product变化组合的ID。连字符( - )的字符串之间的字符表示的变化选项的ID。

我想使其他ID的副本基础上,主要结合ID免费的变化选项。

我的代码:

function find_replace($array, $find, $replace){
    $array = array_replace($array,
        array_fill_keys(
            array_keys($array, $find),
            $replace
        )
    );
    return $array;
}

function get_var_key($array, $value){
    $key_name=false;

    foreach ($array as $n=>$c)
    if (in_array($value, $c)) {
        $key_name=$n;
        break;
    }

    return $key_name;
}

$get_free_keys = array(
    "var1" => array(
        "free1", 
        "free2"
    ),
    "var2" => array(
        "free3", 
        "free4"
        )
);
$main_combine = "a1-b1-free1-c1-d1-free3";

$main_combine_explode = explode("-", $main_combine);

for($i=0; $i < count($main_combine_explode); $i++){
    $get_key_by_value = get_var_key($get_free_keys, 
    $main_combine_explode[$i]); // return "var1" or "var2"

    foreach($get_free_keys[$get_key_by_value] as $values){
        $find_combine = find_replace($main_combine_explode, 
        $main_combine_explode[$i], $values);
        $combines[] = implode("-", $find_combine);
    }
}


print_r($combines); 

错误的结果:

Array
(
    [0] => a1-b1-free1-c1-d1-free3 // main combine (ok)
    [1] => a1-b1-free2-c1-d1-free3 // ok
    [2] => a1-b1-free1-c1-d1-free3 // wrong
    [3] => a1-b1-free1-c1-d1-free4 // wrong
)

结果是不正确

我希望得到以下结果:

Array
(
    [0] => a1-b1-free1-c1-d1-free3-e1 // $main_combine
    [1] => a1-b1-free1-c1-d1-free4-e1
    [2] => a1-b1-free2-c1-d1-free3-e1
    [3] => a1-b1-free2-c1-d1-free4-e1
) 

要么

Array
(
    [var1] => Array
        (
            [0] => a1-b1-free1-c1-d1-free3 // $main_combine
            [1] => a1-b1-free2-c1-d1-free3
        )
    [var2] => Array
        (
            [0] => a1-b1-free1-c1-d1-free4
            [1] => a1-b1-free2-c1-d1-free4
        )
) 

谢谢。

分析解答

您可以使用get_combinationsstr-replace做:

$template = "a1-b1-@FIRST@-c1-d1-@SECOND@-e1";
foreach (get_combinations($get_free_keys) as $e) {
    $res[] = str_replace(['@FIRST@', '@SECOND@'], $e, $template);
}

活生生的例子:3v4l