Выборка уникальных массивов из массива php

215
11 мая 2022, 17:40

Задача стоит следующая. Получен массив содержащий другие массивы, например:

$arr = array(
        array(
            '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'заочная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Физика',
            '1' => 'очная',
            '2' => 'пропуск'
        )
    );

Из этого набора нужно вытащить только уникальные наборы. Значения во всех поля будут меняться. Собственно не пойму как выбрать массивы основываясь на уникальности нескольких столбцов.

В итоге должен получить массивы:

'Химия', 'очная', 'пропуск'
'Химия', 'заочная', 'пропуск'
'Физика', 'очная', 'пропуск'

Пробовал через array_unique($arr);, но получаю только одну первую запись

Нашел на сайте вопрос про выборку, но увы мне не подходит.

Стоит добавить, что во внутренних массивах есть еще столбцы содержащие данные также разные.

Answer 1
$arr = array(
        array(
          '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'заочная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Физика',
            '1' => 'очная',
            '2' => 'пропуск'
        )
    );

foreach ($arr as $key => $value) {
$set[]=$value[0].';'.$value[1].';'.$value[2];
}
foreach ($set as $key1 => $value1) {
    
$res[$value1]=$key1;
}
foreach ($res as $key2 => $value2) {
$main[]=explode(";", $key2);
}
print_r($main);
?>
Answer 2

Можете попробовать сереализовать внутренние массивы, отфильтровать, и сделать обратно десериализацаю. Пример ниже привел:

<?php
$arr = array(
        array(
            '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'заочная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Химия',
            '1' => 'очная',
            '2' => 'пропуск'
        ),
        array(
            '0' => 'Физика',
            '1' => 'очная',
            '2' => 'пропуск'
        )
    );
function _serialize($arr)
{
    return implode("\t", $arr);
}
function _deserialize($data)
{
    return explode("\t", $data);
}
$arr_unique = array_unique(array_map('_serialize', $arr));
$arr_unique = array_map('_deserialize', $arr_unique);
var_dump($arr_unique);
READ ALSO
Как правильно реализовывать корзину Laravel?

Как правильно реализовывать корзину Laravel?

Всем привет! Я новичок, поэтому хотелось бы услышать несколько советов

198
Как вывести данные из MySQL при помощи PHP?

Как вывести данные из MySQL при помощи PHP?

Есть таблица news, в ней 5 полей id, text, title, author, dateНеобходимо вывести на странице эти данные

230
Несколько id категорий

Несколько id категорий

Нужна помощь! в строке 12: private $vacancy_category_id = 105; параметр для id 105 категории подключает функции которые прописаны ниже, сейчас параметры подключаются...

188