Создать новый уникальный массив с другими массивами - PullRequest
0 голосов
/ 07 мая 2019

У меня есть простая система продуктов в моем проекте. Мне нужно, чтобы названия опций моего продукта и варианты продукта выглядели так. "Color" => "Red, Blue, Yellow" "Размер" => "S, M, L, XL"

Мои записи в базе данных выглядят так

Option names  Options    
Color,Size    Red-S        
Color,Size    Blue-S        
Color,Size    Yellow-S       
Color,Size    Red-M        
Color,Size    Blue-M        
Color,Size    Yellow-M        
Color,Size    Red-L

Это мой код:

   foreach ($data as $product) {
       $variations = Products::where('group', $product['sku'])->get();

   }
       $count = count($variations);
       if($count > 0){
           $array2 = [];
           $ss = [];

           foreach($variations as $variants){
               $oname = explode(',', $variants['o_name']);
               $option = explode('-', $variants['option']);
               $array = array_combine($oname, $option);
               $array2[] = compact('array');
               $x = count($oname);
               $xz = $x - 1;
               for($i = 0; $i <= $xz; $i++){

                   $xs = $option[$i];

               }
               $ss[] = $xs;

           }

           dd($ss);

Выход:

      array:12 [▼
      0 => "S"
      1 => "S"
      2 => "S"
      3 => "M"
      4 => "M"
      5 => "M"
      6 => "L"
      7 => "L"
      8 => "L"
      9 => "XL"
      10 => "XL"
      11 => "XL"
       ]

Как я могу создать такой массив

"Color" => "Red,Blue,Yellow"

Ответы [ 2 ]

0 голосов
/ 07 мая 2019
$variations = Products::where('group', $product['sku'])->get();

//This is me emulating your results
$variations = [];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Red-S'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Blue-S'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Yellow-S'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Red-M'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Blue-M'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Yellow-M'];
$variations[]= ['o_name'=>'Color,Size', 'option' =>'Red-L'];

//get all the possible options here
$all_options = [];
foreach ( $variations as $variants) {
    $oname = explode(',', $variants['o_name']);
    $option = explode('-', $variants['option']);
    $all_options[] = array_combine($oname, $option);
}

//aggregating attributes and values
$unique = [];
$keys = array_keys( $all_options[0]);
foreach ($keys as $key) {
    $unique[$key] = array_map(function($option) use ($key){
        return $option[$key];
    },$all_options);
}

//selecting unique values
foreach ($unique as $key => $value) {
    $unique[$key] = array_unique($unique[$key]);
    $unique[$key] = implode(',',$unique[$key]);
}

var_dump($unique);
0 голосов
/ 07 мая 2019

Я не уверен, что понимаю внутренний цикл for, но вы можете сделать это следующим образом - сохранить в $ss (в соответствии с именем каждого параметра) значения в качестве ключей, а после извлечения цикла amd развернуть их.

После array_combine сделать:

foreach($array as $name => $v) {
    $ss[$name][$v] = true;
}

После всего цикла получить только ключи и взорваться:

foreach($ss as &$arr) {
    $arr = implode(",", array_keys($arr));
}

Вот живой пример, чтобы упростить задачу: 3v4l

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