Как преобразовать один массив в многомерный и групповую базу по имени значения

#php

#php

Вопрос:

по какой-то причине мне трудно преобразовать один массив в многомерный

Я ищу группу с тем же filter_group_id с их фильтрами, подобными этому

если filter_group_id такой же, как и в превью

array[0][имя_группы] => имя_группы, filter_group_id

затем поместите все фильтры для одной и той же группы в массив следующим образом

array[0][filters][] = > name, filter_id

например, у меня есть один массив, подобный этому

 Array
(
[0] => Array
    (
        [filter_group_id] => 43
        [group_name] => price
        [filter_id] => 62
        [name] => 10 - 50 
    )

[1] => Array
    (
        [filter_group_id] => 43
        [group_name] => price
        [filter_id] => 64
        [name] => 100 - 150 
    )

[2] => Array
    (
        [filter_group_id] => 33
        [group_name] => size
        [filter_id] => 52
        [name] => 20m
    )

[3] => Array
    (
        [filter_group_id] => 33
        [group_name] => size
        [filter_id] => 51
        [name] => 10m
    )

[4] => Array
    (
        [filter_group_id] => 32
        [group_name] => color
        [filter_id] => 49
        [name] => red
    )

[5] => Array
    (
        [filter_group_id] => 31
        [group_name] => height
        [filter_id] => 44
        [name] => 90
    )

)
 

и мне нравится становиться таким, как этот

 Array
(
[0] => Array
    (
        [group_name] => Array
            (
                [name] => price
                [filter_group_id] => 43
            )

        [filters] => Array
            (
                [0] => Array
                    (
                        [filter_id] => 62
                        [name] => 10 - 50
                    )

                [1] => Array
                    (
                        [filter_id] => 63
                        [name] => 50 - 100
                    )
            )

    )

[1] => Array
    (
        [group_name] => Array
            (
                [name] => size
                [filter_group_id] => 33
            )

        [filters] => Array
            (
                [0] => Array
                    (
                        [filter_id] => 52
                        [name] => 20m
                    )

                [1] => Array
                    (
                        [filter_id] => 51
                        [name] => 10m
                    )

            )

    )

[2] => Array
    (
        [group_name] => Array
            (
                [name] => color
                [filter_group_id] => 32
            )

        [filters] => Array
            (
                [0] => Array
                    (
                        [filter_id] => 49
                        [name] => red
                    )
            )

    )

[3] => Array
    (
        [group_name] => Array
            (
                [name] => height
                [filter_group_id] => 31
            )

        [filters] => Array
            (
                [0] => Array
                    (
                        [filter_id] => 46
                        [name] => 90
                    )
            )

    )
)
 

Я пробовал это, но они поступают в отдельные массивы

     $new_name = '';
    $old_name = '';
    $i = 0;

        foreach ($query->rows as $key => $value) {

        $new_name = $value['group_name'];
        if ($new_name != $old_name) {
            $data[$i] = array(
                'group_name'    => array(
                    'name'  => $value['group_name'],
                    'filter_group_id'   => $value['filter_group_id']
                ),
                'filters'   => array(
                    'name'  => $value['name'],
                    'filter_id' => $value['filter_id']
                )
            );

            $i  ;
        }else {
            $data[$i] = array(
                'group_name'    => array(
                    'name'  => $value['group_name'],
                    'filter_group_id'   => $value['filter_group_id']
                ),
                'filters'   => array(
                    'name'  => $value['name'],
                    'filter_id' => $value['filter_id']
                )
            );
            
        }

        $old_name = $value['group_name'];
    }
 

Ответ №1:

Вы можете использовать array_reduce для группировки вашего массива на основе значений group_name и filter_group_id , создав ключ для результирующего массива на основе этих двух значений и добавив соответствующие значения фильтра в filters подмассив для каждого ключа. Затем вы можете использовать array_values для переиндексации результирующего массива численно:

 $result = array_reduce($data, function ($c, $v) {
    $key = $v['group_name'] . '#' . $v['filter_group_id'];
    if (!isset($c[$key])) {
        $c[$key] = array('group_name' => array('group_name' => $v['group_name'], 'filter_group_id' => $v['filter_group_id']));

    }
    $c[$key]['filters'][] = array('filter_id' => $v['filter_id'], 'name' => $v['name']);
    return $c;
}, array());

$result = array_values($result);
print_r($result);
 

Вывод слишком длинный, чтобы показывать здесь, но соответствует вашим требованиям.

Демонстрация на 3v4l.org

Комментарии:

1. почти то, что я ищу, как можно изменить group_name на имя массива, а внутри — на name и filter_group_id ?

2. @Ivan извините, не уделил достаточно внимания моему выводу. Я обновил ответ и демонстрацию