Дублируйте путем изменения комбинации массивов в PHP - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть идентификатор комбинации вариантов продукта.Дефис ( - ) Символы между строками представляют идентификатор вариантов варианта.

Я хочу сделать копии других идентификаторов для вариантов свободного варианта на основе идентификатора основной комбинации.

Мои коды:

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
        )
) 

Спасибо.

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете использовать get_combination и str-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

...