Created
May 4, 2018 17:27
-
-
Save pqr/b6bc1fe52e0f89081a07b1270453a9de to your computer and use it in GitHub Desktop.
Сравнение товаров: показать только различаюищеся характеристики
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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