記錄一下商城商品多規格演算法!

勇敢的心 發表於 2021-12-04
演算法

原資料

[{
    "name": "顏色",
    "attr_values": "白色,黑色"
}, {
    "name": "記憶體",
    "attr_values": "64G,128G"
}, {
    "name": "型號",
    "attr_values": "X,pro"
}]

目標資料

 [{
     "price": "0",
     "記憶體": "64G",
     "型號": "X",
     "顏色": "白色"
 }, {
     "price": "0",
     "記憶體": "64G",
     "型號": "pro",
     "顏色": "白色"
 }, {
     "price": "0",
     "記憶體": "128G",
     "型號": "X",
     "顏色": "白色"
 }, {
     "price": "0",
     "記憶體": "128G",
     "型號": "pro",
     "顏色": "白色"
 }, {
     "price": "0",
     "記憶體": "64G",
     "型號": "X",
     "顏色": "黑色"
 }, {
     "price": "0",
     "記憶體": "64G",
     "型號": "pro",
     "顏色": "黑色"
 }, {
     "price": "0",
     "記憶體": "128G",
     "型號": "X",
     "顏色": "黑色"
 }, {
     "price": "0",
     "記憶體": "128G",
     "型號": "pro",
     "顏色": "黑色"
 }]

程式碼

<?php
/**
 * 設定規格
 *
 * @param array $attr_group  例:[['name'=>'顏色','attr_values'=>'白色,紅色']]
 * @param integer $index 第幾輪
 * @param integer $row 第幾行
 * @param array $keys
 * @param array $attrs
 * @return array
 */
function setAttr(array $attr_group, int $index = 0, array $keys = [], array $attrs = []) 
{
    static $row = 0;

    if ($index == 0) {
        foreach($attr_group as $i) {
            $keys[] = 0;
        }
    }

    if (isset($attr_group[$index])) {
        $attr_values = explode(',', $attr_group[$index]['attr_values']);
        foreach($attr_values as $key => $attr_value) {
            $keys[$index] = $key;
            if ($index + 1 == count($attr_group)) {
                foreach($keys as $i => $item) {
                    $attrs[$row][$attr_group[$i]['name']] = explode(',', $attr_group[$i]['attr_values'])[$item];
                }
                $attrs[$row]['price'] = '0';
                $row++;
            } else {
                $attrs = setAttr($attr_group, $index + 1, $keys, $attrs);
            }
        }
    }

    return $attrs;
}

//呼叫
$attr_group = [
    [
        'name' => '顏色',
        'attr_values' => '白色,紅色'
    ], 
    [
        'name' => '記憶體',
        'attr_values' => '64G,128'
    ]
];
$attrs = setAttr($attr_group);
var_dump($attrs);

?>
本作品採用《CC 協議》,轉載必須註明作者和本文連結