Объединить два массива и создать новый - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема с созданием массива.У меня есть форма.Входные данные формы являются входными данными тега.Первый ввод - имя опции.Когда вы вводите любую опцию name, новый тег ввода добавляется в форму.Я размещаю данные в контроллере и создаю автоматические варианты для продукта.Например.Red-S Red-M Blue-S Blue-M ... Код, который я использую, дает вариации, выглядящие так:

array:4 [
 0 => "Red-S"
 1 => "Blue-S"
 2 => "Red-M"
 3 => "Blue-M"
]

И у меня есть еще один массив для имен опций

array:2 [
 0 => "Color"
 1 => "Size"
 ]

Я хочу создать один массив, похожий на этот:

array:2 [
 "Color" => "Red"
 "Size" => "S" 
 ]

Это мой контроллер

function make_combinations($props)
    {
        if ( empty($props) ) return [];
        $keys = array_keys($props);
        $key = $keys[0];
        $values = $props[$key];
        unset($props[$key]);
        $rest =  make_combinations($props);
        if ( empty($values) ) return $rest;
        if ( empty($rest) ) return $values;
        $combinations = [];

        foreach($rest as $comb)
        {
            foreach($values as $value)
            {
                $combinations[] = $value . '-' . $comb;

            }
        }
        return $combinations;
    }

    $inputs = explode(',', $request['option']);
    $props = [];

    foreach($inputs as $input)
    {
        $input_key = strtolower($input);
        if ( !$request->has($input_key) ) continue;
        $input_values = explode(',', $request->input($input_key));
        $props[$input_key] = $input_values;
    }
    $combinations = make_combinations($props);



    $result[] = compact('combinations', 'inputs');






    return view('system.modules.variants', compact('result'));
}

Ответы [ 3 ]

0 голосов
/ 26 апреля 2019

Вы можете пропустить одну петлю.

Вы можете написать код примерно так

$arr = [
 0 => "Red-S-Silk-Y",
 1 => "Blue-S",
 2 => "Red-M-Cotton",
 3 => "Blue-M",
];

$arrFinal = [];
$dataArray = [];
foreach($arr AS $value){
    $expArr = explode("-",$value);
    if(isset($expArr[0])){
      $dataArray['color'] = $expArr[0];
    }
    if(isset($expArr[1])){
      $dataArray['size'] = $expArr[1];
    }
    if(isset($expArr[2])){
      $dataArray['Material'] = $expArr[2];
    }
    if(isset($expArr[3])){
      $dataArray['Style'] = $expArr[3];
    }
    $arrFinal[] = $dataArray;
    Unset($dataArray);
}

echo "<pre>";
print_r($arrFinal);

Ваш вывод будет примерно таким.

Array
(
    [0] => Array
        (
            [color] => Red
            [size] => S
            [Material] => Silk
            [Style] => Y
        )

    [1] => Array
        (
            [color] => Blue
            [size] => S
        )

    [2] => Array
        (
            [color] => Red
            [size] => M
            [Material] => Cotton
        )

    [3] => Array
        (
            [color] => Blue
            [size] => M
        )
)
0 голосов
/ 26 апреля 2019
$result = array_merge($array1, $array2,....);
0 голосов
/ 26 апреля 2019

Если я правильно угадаю, чего вы пытаетесь достичь, имея такой ввод:

$inputs = ["Red-S-Cotton", "Blue-Silk-M"];
$keys = ['Color-Size-Material', 'Color-Material-Size'];

Делая:

$output = array_map(function($key) use ($inputs, $keys) {
    $expKeys = explode('-', $keys[$key]);
    $expInputs = explode('-', $inputs[$key]);
    return array_combine($expKeys, $expInputs);
}, array_keys($inputs));   

$output будет:

[
    [
        "Color" => "Red",
        "Size" => "S",
        "Material" => "Cotton",
    ],
    [
        "Color" => "Blue",
        "Material" => "Silk",
        "Size" => "M",
    ]
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...