объединить несколько массивов, так что есть множество вариантов - PullRequest
0 голосов
/ 06 ноября 2018

Допустим, у меня есть этот массив:

    "variants": [
    {
        "id": 5,
        "name": "color",
        "item_id": 3,
        "created_at": "2018-11-02 15:08:19",
        "updated_at": "2018-11-02 15:08:19",
        "options": [
            {
                "id": 13,
                "name": "red",
                "variant_id": 5,
                "created_at": "2018-11-02 15:08:21",
                "updated_at": "2018-11-02 15:08:21"
            },
            {
                "id": 14,
                "name": "blue",
                "variant_id": 5,
                "created_at": "2018-11-02 15:08:21",
                "updated_at": "2018-11-02 15:08:21"
            },
            {
                "id": 15,
                "name": "green",
                "variant_id": 5,
                "created_at": "2018-11-02 15:08:22",
                "updated_at": "2018-11-02 15:08:22"
            }
        ]
    },
    {
        "id": 6,
        "name": "size",
        "item_id": 3,
        "created_at": "2018-11-02 15:08:19",
        "updated_at": "2018-11-02 15:08:19",
        "options": [
            {
                "id": 16,
                "name": "small",
                "variant_id": 6,
                "created_at": "2018-11-02 15:08:22",
                "updated_at": "2018-11-02 15:08:22"
            },
            {
                "id": 17,
                "name": "medium",
                "variant_id": 6,
                "created_at": "2018-11-02 15:08:22",
                "updated_at": "2018-11-02 15:08:22"
            },
            {
                "id": 18,
                "name": "large",
                "variant_id": 6,
                "created_at": "2018-11-02 15:08:22",
                "updated_at": "2018-11-02 15:08:22"
            }
        ]
    }
]

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

Этот проект написан на PHP специально с использованием фреймворка laravel

1 Ответ

0 голосов
/ 06 ноября 2018

Для размещения на несколько вариантов:

function getVariants($obj)
{
    $variant = array_shift($obj["variants"]); // we use the variants as a stack
    $results = array(); // we will store the results here
    foreach($variant["options"] AS $k=>$v) // we iterate the current variants
    {
        if(count($obj["variants"]) > 0) // if we have more variants still
        {
            $sub = getVariants($obj); // we call getVariants to build next level
            foreach($sub AS $sub_v) // iterate over the results of the child level
            {
                // concatenate whatever came from children to the current names
                $results[] = $v["name"]." ".$sub_v; 
            }
        }
        else
        {
            $results[] = $v["name"]; // this is the last variant so we just add the names.
        }
    }
    return $results;
}

Это должно работать с любой необходимой глубиной комбинаций.

Что этот код использует, он использует варианты в качестве стека, обрабатывающего вариант, и затем, если стек длиннее, все еще вызывает себя, чтобы сделать то же самое на следующем уровне. Каждый уровень возвращает массив себя и своих детей, если таковые имеются.

https://en.wikipedia.org/wiki/Recursion_(computer_science)

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