Задать вопрос

Как отсортировать массив?

Добрый день, подскажите как отсортировать массив что бы остались только одинаковые значения ?
Есть выборка из базы, выбираются по идентификатору товары у которых есть куча значений, но из них есть какие то одинаковые, а какие то разные, нужно что бы остался массив только с одинаковыми значениями.
для примера, из базы получаем
spoiler

Array
(
    [0] => Array
        (
            [attribute_id] => 49
            [name] => Код Viega
            [text] => 746827
        )

    [1] => Array
        (
            [attribute_id] => 40
            [name] => Ду, дюйм
            [text] => 1/2
        )

    [2] => Array
        (
            [attribute_id] => 21
            [name] => Материал корпуса
            [text] => Бронза кремниевая
        )

    [3] => Array
        (
            [attribute_id] => 23
            [name] => Материал шара
            [text] => Сталь нержавеющая
        )

    [4] => Array
        (
            [attribute_id] => 13
            [name] => Применение
            [text] => Водоснабжение, теплоснабжение
        )

    [5] => Array
        (
            [attribute_id] => 15
            [name] => Присоединение
            [text] => Резьба
        )

)
Array
(
    [0] => Array
        (
            [attribute_id] => 49
            [name] => Код Viega
            [text] => 746829
        )

    [1] => Array
        (
            [attribute_id] => 40
            [name] => Ду, дюйм
            [text] => 3/4
        )

    [2] => Array
        (
            [attribute_id] => 21
            [name] => Материал корпуса
            [text] => Бронза кремниевая
        )

    [3] => Array
        (
            [attribute_id] => 23
            [name] => Материал шара
            [text] => Сталь нержавеющая
        )

    [4] => Array
        (
            [attribute_id] => 13
            [name] => Применение
            [text] => Водоснабжение, теплоснабжение
        )

    [5] => Array
        (
            [attribute_id] => 15
            [name] => Присоединение
            [text] => Резьба
        )

)


сортировка должна быть по значению [text] после сортировки должно остаться
spoiler
Array
(
     [0] => Array
        (
            [attribute_id] => 21
            [name] => Материал корпуса
            [text] => Бронза кремниевая
        )

    [1] => Array
        (
            [attribute_id] => 23
            [name] => Материал шара
            [text] => Сталь нержавеющая
        )

    [2] => Array
        (
            [attribute_id] => 13
            [name] => Применение
            [text] => Водоснабжение, теплоснабжение
        )

    [3] => Array
        (
            [attribute_id] => 15
            [name] => Присоединение
            [text] => Резьба
        )

)

или может проще это отсортировать в запросе к базе ?
Спасибо.
  • Вопрос задан
  • 299 просмотров
Подписаться 3 Простой 26 комментариев
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
SELECT name, `text`
FROM product
JOIN product_attribute USING (product_id)
JOIN attribute_description USING (attribute_id)
-- JOIN attribute USING (attribute_id)   -- таблица в запросе не нужна
GROUP BY 1, 2
HAVING COUNT(*) > 1;

fiddle

Если нужна именно сортировка как в эталоне - ну добавить ORDER BY MAX(attribute_id)

Таблица attribute потребуется лишь в случае, если данные из неё нужны (например, в запрос добавится отбор по значению attribute_group_id).

Если надо сравнивать атрибуты у более чем 2 товаров, то соотв. образом откорректировать условие пост-отбора. Например, для 3 товаров и атрибутов, имеющихся у всех трёх, это будет HAVING COUNT(*) = 3
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
v3shin
@v3shin
Веб-шаман
Извращение, конечно, но я бы сделал так:
$ar1 = [
	['a' => 1, 'b' => 2],
	['a' => 2, 'b' => 11],
	['a' => 3, 'b' => 12],
];
$ar2 = [
	['a' => 1, 'b' => 2],
	['a' => 2, 'b' => 11],
	['a' => 3, 'b' => 13],
];

$hashedArray1 = [];
foreach($ar1 as $ar) {
	$hashedArray1[json_encode($ar)] = $ar;
}
$hashedArray2 = [];
foreach($ar2 as $ar) {
	$hashedArray2[json_encode($ar)] = $ar;
}
var_dump(array_intersect_key($hashedArray1, $hashedArray2));
Ответ написан
вам нужно почитать про EAV
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы