#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);
Вывод слишком длинный, чтобы показывать здесь, но соответствует вашим требованиям.
Комментарии:
1. почти то, что я ищу, как можно изменить group_name на имя массива, а внутри — на name и filter_group_id ?
2. @Ivan извините, не уделил достаточно внимания моему выводу. Я обновил ответ и демонстрацию