Добавить многомерный массив в подмассив другого многомерного массива - PullRequest
0 голосов
/ 10 мая 2018

Благодаря Philipp Maurer я смог объединить два многомерных массива, получив окончательный массив:

[0]=>
    ['unique_codename']=>'cars'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘cars’
        ['name'] = 'audi'
        …
    [1]=>
        [‘codename’] = ‘cars’
        ['name'] = 'volvo'
        …
    ['category']=>'vehicle'
    …

 [1]=>
    ['unique_codename']=>'fruit'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘fruit’
        ['name'] = 'banana'
        …
    [1]=>
        [‘codename’] = ‘fruit’
        ['name'] = 'apple'
        …
    ['category']=>'food'
    …

 [2]=>
    ['unique_codename']=>'vegetables'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘vegetables’
        ['name'] = 'cauliflower'
        …
    ['category']=>'food'
    …
…

Теперь я хочу объединить этот массив с нимтоже:

[0]=>
    ['codename']=>'fruit'
    ['name']=>'banana'
    [‘type’]=>’yellowbanana’
    …some other stuf…
 [1]=>
    ['codename']=>'fruit'
    ['name']=>'banana'
    [‘type’]=>’brownbanana’
    …some other stuf…
 [2]=>
    ['codename']=>’cars’
    ['name']=>’audi’
    [‘type’]=>’a2’
    …some other stuf…
 [3]=>
    ['codename']=>'fruit'
    ['name']=>'banana'
    [‘type’]=>’greenbanana’
    …some other stuf…
 [4]=>
    ['codename']=>’cars’
    ['name']=>’audi’
    [‘type’]=>’a6’
    …some other stuf…
 [5]=>
    ['codename']=>’cars’
    ['name']=>’other’
    [‘type’]=>’dummytext1’
    …some other stuf…
 [6]=>
    ['codename']=>’cars’
    ['name']=>’other’
    [‘type’]=>’dummytext2’
    …some other stuf…
…

Что должно привести к окончательному массиву (bis):

[0]=>
    ['unique_codename']=>'cars'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘cars’
        ['name'] = 'audi'
        [‘types’]=>
        [0]=>
            [‘type’] = ‘a2’
            …
        [1]=>
            [‘type’] = ‘a6’
            …
     …
    [1]=>
        [‘codename’] = ‘cars’
        ['name'] = 'volvo'
        …
    [2]=>
        [‘codename’] = ‘cars’
        ['name'] = ‘other’
        [‘types’]=>
        [0]=>
            [‘type’] = ‘dummytext1’
            …
        [1]=>
            [‘type’] = ‘dummytext2’
            …
     …
    ['category']=>'vehicle'
    …

 [1]=>
    ['unique_codename']=>'fruit'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘fruit’
        ['name'] = 'banana'
        [‘types’]=>
        [0]=>
            [‘type’] = ‘yellowbanana’
            …
        [1]=>
            [‘type’] = ‘brownbanana’
            …
        [2]=>
            [‘type’] = ‘greenbanana’
            …
       …
    [1]=>
        [‘codename’] = ‘fruit’
        ['name'] = 'apple'
        …
    ['category']=>'food'
    …

 [2]=>
    ['unique_codename']=>'vegetables'
    ['sorts']=>
    [0]=>
        [‘codename’] = ‘vegetables’
        ['name'] = 'cauliflower'
        …
    ['category']=>'food'
    …
 …

Я пробовал тот же подход, что и первое слияние, но не могусделай это правильно.Поскольку это, вероятно, требует другого подхода, я открыл для него новый вопрос.Заметьте, что иногда новое имя следует добавлять к исходному подмассиву, если его еще не было (в моем примере это «прочее»).

Кто-нибудь может мне помочь с этим?Я не Волшебник Массива, очевидно ... Любая помощь очень ценится!

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете использовать array_combine(), чтобы начать использовать unique_codename в качестве ключей в исходном массиве, чтобы разрешить поиск по нему. Затем вы можете использовать цикл над новым массивом и проверить, существует ли codename в «основном массиве». Если бы вы могли добавить новый type внутри types в основном массиве:

$init = array(); // your initial array
$array = array(); // your new array

$init = array_combine(array_column($init, 'unique_codename'), $init);
foreach ($array as $k => $item) {
    if (isset($init[$item['codename']])) {
        foreach ($init[$item['codename']]['sorts'] as &$sort) { // $sort is used as reference
            if ($sort['name'] == $item['name']) {
                $sort['types'][] = $item['type'];
            }
        }
    }
}
print_r(array_values($init));

Вывод (см. онлайн-демонстрация ):

Array
(
    [0] => Array
        (
            [unique_codename] => cars
            [sorts] => Array
                (
                    [0] => Array
                        (
                            [codename] => cars
                            [name] => audi
                            [types] => Array
                                (
                                    [0] => a2
                                    [1] => a6
                                )

                        )

                    [1] => Array
                        (
                            [codename] => cars
                            [name] => volvo
                        )

                )

            [category] => vehicle
        )

    [1] => Array
        (
            [unique_codename] => fruit
            [sorts] => Array
                (
                    [0] => Array
                        (
                            [codename] => fruit
                            [name] => banana
                            [types] => Array
                                (
                                    [0] => yellowbanana
                                    [1] => brownbanana
                                    [2] => greenbanana
                                )

                        )

Пример с данными:

$init = [
    [
        'unique_codename'=>'cars',
        'sorts'=>[
            ['codename' => 'cars', 'name' => 'audi'],
            ['codename' => 'cars', 'name' => 'volvo']
        ],
        'category'=>'vehicle',
    ],
    [
        'unique_codename'=>'fruit',
        'sorts'=>[
            ['codename' => 'fruit', 'name' => 'banana'],
            ['codename' => 'fruit', 'name' => 'apple'],
        ],
        'category'=>'food',
    ],
    [
        'unique_codename'=>'vegetables',
        'sorts'=>[
            ['codename' => 'vegetables', 'name' => 'cauliflower'],
        ],
        'category'=>'food',
    ],
];

$array = [
    ['codename'=>'fruit', 'name'=>'banana', 'type'=>'yellowbanana'],
    ['codename'=>'fruit', 'name'=>'banana', 'type'=>'brownbanana'],
    ['codename'=>'cars', 'name'=>'audi', 'type'=>'a2'],
    ['codename'=>'fruit', 'name'=>'banana', 'type'=>'greenbanana'],
    ['codename'=>'cars', 'name'=>'audi', 'type'=>'a6'],
    ['codename'=>'cars', 'name'=>'other', 'type'=>'dummytext1'],
    ['codename'=>'cars', 'name'=>'other', 'type'=>'dummytext2'],
];

$init = array_combine(array_column($init, 'unique_codename'), $init);
foreach ($array as $k => $item) {
    if (isset($init[$item['codename']])) {
        foreach ($init[$item['codename']]['sorts'] as &$sort) {
            if ($sort['name'] == $item['name']) {
                $sort['types'][] = $item['type'];
            }
        }
    }
}
print_r(array_values($init));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...