0
votes

I have the following:

$variants = [
     0 => [
     "variant_name" => "iPhone 5",
     "sku_id" => "2",
     "sku" => "GLC-IPH5REDXXXL",
     "stock_total" => "10",
     "stock_left" => "10",
     "retail_price" => 1000,
     "on_sale_price" => 0
    ],
    1 => [
     "variant_name" => "Red",
     "sku_id" => "2",
     "sku" => "GLC-IPH5REDXXXL",
     "stock_total" => "10",
     "stock_left" => "10",
     "retail_price" => 1000,
     "on_sale_price" => 0
    ],
    2 => [
     "variant_name" => "iPhone 6s Plus",
     "sku_id" => "4",
     "sku" => "GLC-IPH6SP",
     "stock_total" => "5",
     "stock_left" => "5",
     "retail_price" => 1000,
     "on_sale_price" => 0
    ],
    3 => [
     "variant_name" => "iPhone 6s",
     "sku_id" => "13",
     "sku" => "GLC-IPH6S",
     "stock_total" => "5",
     "stock_left" => "5",
     "retail_price" => 1000,
     "on_sale_price" => 0
    ]
 ]

I would like to put them in the following array

0 => [
 "sku_id" => "2",
 "sku" => "GLC-IPH5REDXXXL",
 "stock_total" => "10",
 "stock_left" => "10",
 "retail_price" => 1000,
 "on_sale_price" => 0,
 "options" => ['iPhone 4', 'Red'],
 "option1" => 'iPhone4',
 "option2" => 'Red',
 "option3" => null
],
1 => [
 "sku_id" => "4",
 "sku" => "GLC-IPH6SP",
 "stock_total" => "5",
 "stock_left" => "5",
 "retail_price" => 1000,
 "on_sale_price" => 0,
 "options" => ['iPhone 6s Plus'],
 "option1" => 'iPhone 6s Plus',
 "option2" => null,
 "option3" => null
],
2 => [
 "sku_id" => "13",
 "sku" => "GLC-IPH6S",
 "stock_total" => "5",
 "stock_left" => "5",
 "retail_price" => 1000,
 "on_sale_price" => 0,
 "options" => ['iPhone 6s'],
 "option1" => 'iPhone 6s',
 "option2" => null,
 "option3" => null
]
  1. I can't fill the options with each variant_name
  2. I can't set the option1, option2, option3 with each corresponding variant_name

I've tried a simple foreach($variants as $v) loop on the first array and I got it working until options, option1, option2, option3 from which I get the repeating values.

I just can't figure it out how to do it, any suggestions?

2

2 Answers

0
votes

You could use a simple foreach() and perhaps a for(). The for() here is a little inefficient because it runs every time, so it's highly repetitive and continually overwrites...but it works:

 foreach($variants as $rows) {
    $sku[$rows['sku_id']]['sku_id']         =   $rows['sku_id'];
    $sku[$rows['sku_id']]['sku']            =   $rows['sku'];
    $sku[$rows['sku_id']]['stock_total']    =   $rows['stock_total'];
    $sku[$rows['sku_id']]['stock_left']     =   $rows['stock_left'];
    $sku[$rows['sku_id']]['retail_price']   =   $rows['retail_price'];
    $sku[$rows['sku_id']]['on_sale_price']  =   $rows['on_sale_price'];
    $sku[$rows['sku_id']]['options'][]      =   $rows['variant_name'];

    for($i = 0; $i < 3; $i++)
        $sku[$rows['sku_id']]['option'.($i+1)]  =   (isset($sku[$rows['sku_id']]['options'][$i]))? $sku[$rows['sku_id']]['options'][$i] : NULL;
 }

echo print_r(array_values($sku));

Gives you:

Array
    (
        [0] => Array
            (
                [sku] => GLC-IPH5REDXXXL
                [stock_total] => 10
                [stock_left] => 10
                [retail_price] => 1000
                [on_sale_price] => 0
                [options] => Array
                    (
                        [0] => iPhone 5
                        [1] => Red
                    )

                [option1] => iPhone 5
                [option2] => Red
                [option3] => 
            )

        [1] => Array
            (
                [sku] => GLC-IPH6SP
                [stock_total] => 5
                [stock_left] => 5
                [retail_price] => 1000
                [on_sale_price] => 0
                [options] => Array
                    (
                        [0] => iPhone 6s Plus
                    )

                [option1] => iPhone 6s Plus
                [option2] => 
                [option3] => 
            )

        [2] => Array
            (
                [sku] => GLC-IPH6S
                [stock_total] => 5
                [stock_left] => 5
                [retail_price] => 1000
                [on_sale_price] => 0
                [options] => Array
                    (
                        [0] => iPhone 6s
                    )

                [option1] => iPhone 6s
                [option2] => 
                [option3] => 
            )
    )
0
votes

Solution

$result = [];

foreach($variants as $v) {
    $result[$v['sku_id']]['sku_id'] = $v['sku_id'];
    $result[$v['sku_id']]['sku'] = $v['sku'];
    $result[$v['sku_id']]['stock_left'] = $v['stock_left'];
    $result[$v['sku_id']]['retail_price'] = price($v['retail_price']);
    $result[$v['sku_id']]['options'][] = $v['variant_name'];

    if(isset($result[$v['sku_id']]['options'][0])) {
        $result[$v['sku_id']]['option1'] = $result[$v['sku_id']]['options'][0]; 
    }
    else {
        $result[$v['sku_id']]['option1'] = null;        
    }

    if(isset($result[$v['sku_id']]['options'][1])) {
        $result[$v['sku_id']]['option2'] = $result[$v['sku_id']]['options'][1]; 
    }
    else {
        $result[$v['sku_id']]['option2'] = null;        
    }

    if(isset($result[$v['sku_id']]['options'][2])) {
        $result[$v['sku_id']]['option3'] = $result[$v['sku_id']]['options'][2]; 
    }
    else {
        $result[$v['sku_id']]['option3'] = null;        
    }
}

return $result;