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

Привет, есть проблема с объединением массива

Мой первый массив - это параметры продукта

Второй массив - это варианты продукта

Мне нужно продублировать значения моего массива параметров, пока значения равнык количеству значений второго массива.

Например,

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

в значениях этого массива равно 2 = 2 Но у моего массива $ keys есть только одно значение

$key = ['Color-Size-Material'];

когда я пытался объединить их, я получаю сообщение об ошибке, потому что они не равны.

Мои значения массива и имена значений могут изменяться и получать случайно.у меня есть код выглядит следующим образом:

     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);
    $as = array(implode('-', $inputs));


    $inpu = $combinations;
    $keys =$as;
    $say = count($inpu);
    $say2 = count($keys);
    if($say2 < $say) {

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


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






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

вывод моего первого массива:

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

Вывод второго массива:

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

Первый массив может быть цвета-Size-Material-Type .... Второй массив может быть Red-SA-Cotton ... Пожалуйста, помогите мне

Мне нужен вывод, как это:

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

Ответы [ 2 ]

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

Просто используйте array_combine() -

array_combine - создает массив, используя один массив для ключей и другой для его значений

Пример:

<code>$toBeKeys = ['color', 'size'];
$toBeValues = ['green', 'M'];

$array = array_combine($toBeKeys, $toBeValues);

echo '<pre>'. print_r($array, 1) .'
'; # будет выводить # Array => [ # 'color' => 'green', # 'size' => 'M' #]

Edit:

<code>$input = ['red-s', 'blue-m'];
$keys = ['color', 'size'];

foreach ($input as $el)
{
    $attr = explode('-', $el);
    $combined = array_combine($keys, $attr);

    echo '<pre>'. print_r($array, 1) .'
'; }
0 голосов
/ 26 апреля 2019

Вы можете использовать array_map, array_combine

$inputs = ["Red-S-Cotton", "Blue-Silk-M"];
$keys   = ['Color-Size-Material', 'Color-Material-Size'];
$res = array_map(function($v1, $v2) {
    return array_combine(explode('-', $v2), explode('-', $v1));
}, $inputs, $keys);
echo '<pre>';
print_r($res);

ИЛИ

$inputs = ["Red-S-Cotton", "Blue-Silk-M"];
$keys   = ['Color-Size-Material', 'Color-Material-Size'];
$res = [];
array_walk($inputs, function($v,$k) use ($keys, &$res){
  $res[] = array_combine(explode('-', $keys[$k]), explode('-', $v));
});
echo '<pre>';
print_r($res);

Результат

Array
(
[0] => Array
    (
        [Color] => Red
        [Size] => S
        [Material] => Cotton
    )

[1] => Array
    (
        [Color] => Blue
        [Material] => Silk
        [Size] => M
    )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...