@Alcospb

Как найти схожие элементы многомерного массива?

Привет

Я сначала попытался описать общую задачу, но получилось сложнова-то. Оставил это описание ниже.

Реальная задача звучит так:
У меня есть сотни квартир в виде массива.
Планировка - это площади (общая, жилая, кухня), кол-во комнат, цена, этаж.
Множество повторяющихся планировок различаются только по цене и этажу. Необходимо объединить одинаковые планировки в одну запись и создать для таких записей массив в котором будет храниться зависимости этажа от цены.

Общий вид задачи:
Имеем большой многомерный массив данных:

$arr = [
'0' => [
 'foo1' => 'bar1',
 'foo2' => 'bar2',
 'foo3' => 'buz1',
 'floor' => 1,
],
'1' => [
 'foo1' => 'bar1',
 'foo2' => 'bar2',
 'foo3' => 'buz2',
 'floor' => 7,
],
'3' => [
 'foo1' => 'bar3',
 'foo2' => 'bar4',
 'foo3' => 'buz3',
 'floor' => 1,
],
...
]


Задача:
Получить новый массив аналогичной структуры в котором записи с одинаковыми значениями foo1 и foo2 будут объединены в одну запись, а записи buz1 и buz2 будут объединены во вложенный в эту запись массив.

Результат:
$arr = [
'0' => [
 'foo1' => 'bar1',
 'foo2' => 'bar2',
 'dependence' => ['1' => buz1, '7' => buz2],
],
'1' => [
 'foo1' => 'bar3',
 'foo2' => 'bar4',
 'dependence' => ['1' => buz3],
],
]
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
<?php
$arr = [
'0' => [
 'foo1' => 'bar1',
 'foo2' => 'bar2',
 'foo3' => 'buz1',
 'floor' => 1,
],
'1' => [
 'foo1' => 'bar1',
 'foo2' => 'bar2',
 'foo3' => 'buz2',
 'floor' => 7,
],
'3' => [
 'foo1' => 'bar3',
 'foo2' => 'bar4',
 'foo3' => 'buz3',
 'floor' => 1,
],
];

$result = [];
	
foreach ($arr as $item)
{
	$key = $item['foo1'].'&'.$item['foo2']; // Разделитель для ключа нужно подбирать исходя из того, что хранится в foo1 и foo2
	
	if (!array_key_exists($key, $result))
	{
		$result[$key] = [
			'foo1' => $item['foo1'],	
			'foo2' => $item['foo2'],
			'dependence' => []
		];
	}
	
	$result[$key]['dependence'][$item['floor']] = $item['foo3'];
}

$result = array_values($result);

echo '<pre>';
var_dump($result);
echo '</pre>';
?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
07 мая 2024, в 20:44
500 руб./за проект
07 мая 2024, в 20:21
900000 руб./за проект
07 мая 2024, в 19:52
50000 руб./за проект