@twohundrediq

Как удалить повторяющиеся элементы в многомерном массиве?

У меня есть массив такого вида
$materials = [
    [
        'name'              => 'one',
        'material_group'    => 1,
        'price'             => 200,
    ],
    [
        'name'              => 'two',
        'material_group'    => 2,
        'price'             => 200,
    ],
    [
        'name'              => 'three',
        'material_group'    => 1,
        'price'             => 100,
    ],
    [
        'name'              => 'four',
        'material_group'    => 1,
        'price'             => 90,
    ],
    [
        'name'              => 'five',
        'material_group'    => 1,
        'price'             => 130,
    ],
    [
        'name'              => 'six',
        'material_group'    => 1,
        'price'             => 25,
    ],
    [
        'name'              => 'seven',
        'material_group'    => 1,
        'price'             => 900,
    ],
    [
        'name'              => 'five',
        'material_group'    => 1,
        'price'             => 130,
    ]
];


Мне необходимо найти минимальное значение элементов у которых совпадает material_group, чтобы плучилось вот так:
$materials = [
    [
        'name'              => 'two',
        'material_group'    => 2,
        'price'             => 200,
    ],
    [
        'name'              => 'six',
        'material_group'    => 1,
        'price'             => 25,
    ]
];

Подскажите, как это сделать?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 2
twobomb
@twobomb
array_multisort(array_column($materials,"price"), $materials);
$materials = array_reduce($materials,function($a,$b){
    if(!in_array($b["material_group"],array_column($a,"material_group")))
        array_push($a,$b);
    return $a;
},[]);
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Соггласно заветам FanatPHP делаем выборку самых дешёвых материалов в каждой категории средствами базы данных:

$query = "
	SELECT 
		materials.* 
	FROM materials 
	JOIN (
		SELECT material_group, MIN(price) chipest_price
		FROM materials
		GROUP BY material_group
	) chipest ON 
		chipest.material_group = materials.material_group AND
		chipest_price = price;";

$stmt = $pdo->prepare($query);
$stmt->execute();
$rows = $stmt->fetchALL(PDO::FETCH_ASSOC);

var_export($rows);


php code online
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
$result = [];
foreach($materials as $row)
{
    $result[$row['material_group']] = 
        (!isset($result[$row['material_group']]) || $result[$row['material_group']]['price'] > $row['price']) ?
        $row : $result[$row['material_group']];
}
$result = array_values($result);

print_r($result);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы