Skip to content

Instantly share code, notes, and snippets.

@pqr
Created May 4, 2018 17:27
Show Gist options
  • Save pqr/b6bc1fe52e0f89081a07b1270453a9de to your computer and use it in GitHub Desktop.
Save pqr/b6bc1fe52e0f89081a07b1270453a9de to your computer and use it in GitHub Desktop.
Сравнение товаров: показать только различаюищеся характеристики
<?php
// Предположим мы достали данные из базы:
$goods = [
1002 => [
'Price' => 1000,
'Weight' => 12,
'Color' => 'red',
'Rating' => 3,
],
3300 => [
'Price' => 3000,
'Weight' => 55,
'Color' => 'red',
'Rating' => 3,
],
5408 => [
'Price' => 5000,
'Weight' => 12,
'Color' => 'red',
'Rating' => 3,
],
];
// Также предположим, что набор колонок для всех элементов одинаков
// т.е. набор колонок можно вынуть из первого элемента
$firstElement = reset($goods);
$columns = array_keys($firstElement);
// Теперь нам нужно понять, какие колонки содержат абслютно одинаковые значения для всех элементов?
// Эти колонки в итоге нужно будет удалить из $goods
foreach($columns as $columnKey) {
// Проверим текущую колонку $columnKey:
$columnValues = array_column($goods, $columnKey);
// Все ли элементы одинаковы?
// Внимание: array_unique может дать просадку по производительности
// но если мы говрим о задаче сравнения характеристик товаров,
// то обычно эти 5-10 товаров помноженное на 30-100 характеристик
// на таких объёмах данных не будет заметно
$uniqueValues = array_unique($columnValues);
// Сколько получилось уникальных значений?
if (count($uniqueValues) === 1) {
// Если ровно одно уникальное значение в текущей колонке, значит во всех товарах данный параметр одинаков
// Удаляем этот парамтер из всех товаров
foreach($goods as &$good) {
unset($good[$columnKey]);
}
// Хороший тон сделать unset для ссылки, чтобы не утекла куда-то ещё ниже по коду
// (в данном примере можно не удалять, разницы не будет, но для аккуратоности добавил)
unset($good);
}
}
// В итоге получили требуемый результат:
var_dump($goods);
/*
array(3) {
[1002] =>
array(2) {
'Price' =>
int(1000)
'Weight' =>
int(12)
}
[3300] =>
array(2) {
'Price' =>
int(3000)
'Weight' =>
int(55)
}
[5408] =>
array(2) {
'Price' =>
int(5000)
'Weight' =>
int(12)
}
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment