TransWikia.com

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

Stack Overflow на русском Asked on February 18, 2021

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

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

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

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

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

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

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

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

2 Answers

$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);

?>

Correct answer by Bloom on February 18, 2021

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

<?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);

Answered by Evgenii Izhboldin on February 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP