PHP 7. Подскажите более красивый вариант перебора массива
Здрасьте! В общем есть массив вида [2 => ['element_id'=> [3,2]], 1 => ['element_id'=>[1]]];
Где ключи обозначают определенные id. Мне нужно перебрать данный массив так, чтобы внутренние элементы были сгруппированы с внешним ключом и получилась строка такого вида:
Группа 1 (Элемент 1) AND Группа 2 (Элемент 3 + Элемент 2)
Для этих целей я написал вот такую конструкцию:
$array = [2 => ['element_id'=> [3,2]], 1 => ['element_id'=>[1]]];
ksort($array);
$cnt = count($array);
$i = 0;
$string = '';
foreach ($array as $k => $v) {
$i++;
$string .= 'Группа '.$k .'';
$i2 = 0;
$cnt2 = count($v['element_id']);
$string2 = '';
foreach ($v['element_id'] as $value){
$i2++;
$string2 .= 'Элемент '.$value;
if($i2<$cnt2){
$string2 .= ' + ';
}
}
$string .= ' ('. $string2.')';
if($i<$cnt){
$string .= ' AND ';
}
}
echo $string; //Группа 1 (Элемент 1) AND Группа 2 (Элемент 3 + Элемент 2)
Вариант хоть и рабочий и выдает все что мне нужно, но у меня есть стойкое ощущение, что можно было бы сделать красивее и лучше. Вопрос к знатокам: Как сделать данное решение элегантным?
Ответы (2 шт):
Автор решения: u_mulder
→ Ссылка
$array = [2 => ['element_id'=> [3,2]], 1 => ['element_id'=>[1]]];
ksort($array);
$parts = [];
foreach ($array as $groupID => $elements) {
$subParts = [];
foreach ($elements['element_id'] as $element) {
$subParts[] = 'Элемент ' . $element;
}
$parts[] = 'Группа ' . $groupID . ' (' . implode(' + ', $subParts) . ')';
}
echo implode(' AND ', $parts);
Автор решения: teran
→ Ссылка
array_map, array_keys, array_column, implode вам в помощь
$data = [2 => ['element_id'=> [3,2]], 1 => ['element_id'=>[1]]];
$result = implode(' AND ', array_map(function($k, $v){
$elements = implode('+', array_map(function($e){
return "Элемент $e";
}, $v));
return "Группа $k ($elements)";
},
array_keys($data),
array_column($data, 'element_id')
));