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

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

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

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

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

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

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

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

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


Ответы (2 шт):

Автор решения: Evgenii Izhboldin

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

<?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);
→ Ссылка
Автор решения: Bloom
$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);

?>
→ Ссылка