Выборка уникальных массивов из массива 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);
?>