Выбрать только уникальные массивы (и с большей длинной) из многомерного массива

121
25 августа 2019, 20:20

Пример массива:

array(
    0 => array(
        'alias' => 'test',
        'title' => 'stack',
        'content' => 'overflow',
        'year' => 2019,
        'test' => null
    ),
    1 => array(
        'alias' => null,
        'title' => 'stack',
        'content' => 'overflow',
        'year' => null,
        'test' => null
    ),
    2 => array(
        'alias' => 'else',
        'title' => 'demo',
        'content' => 'stack_overflow',
        'year' => 2020,
    )
);

Уникальным ключом является title, выходит массивы с индексами 0, 1, являются дублями, таких массивов может быть очень много...

Мне нужно оставить только тот массив в котором меньше всего значений null, то есть в данном случае массив с индексом 1 нужно удалить, так-как это дубль массива с индексом 0 и т.д. Таких дублей может быть разное количество.

Думал сделать что-то подобное:

if(strlen(serialize($array))) {
    //Пишем массив который длиннее 
}

Но не могу придумать как найти совпадения...

Answer 1

В итоге написал такую функцию:

public function removeArrayDuplicates($array, $index_key) {
    $result = array_reverse(
        array_values(
            array_column(
                array_reverse($array), null, $index_key)
        )
    );
    return $result;
}
var_dump(removeArrayDuplicates($array, $title));

Получаю массивы без дублей и с нужными значениями.

UPDATE: Всё таки не с нужными значениями.

Данная функция не сработала как ожидалось поэтому нагородил другую. Эта точно работает как нужно. Может кому то будет полезно, либо сможете улучшить мой ответ.

function removeArrayDuplicates($array, $search_key) {
    $stored_duplicates = array();
    $max_array_length = null;
    $current_array = null;
    $result = array();
    foreach($array as $item) {
        $stored_duplicates[$item[$search_key]][] = $item;
    }
    foreach($stored_duplicates as $arrays) {
        foreach($arrays as $item) {
            if(count($arrays) > 1) {
                $array_length = strlen(serialize($item));
                if($array_length > $max_array_length) {
                    $max_array_length = $array_length;
                    $current_array = $item;
                }
            }
            else {
                $result[] = $item;
            }
        }
        if($current_array) {
            $result[] = $current_array;
            $max_array_length = null;
            $current_array = null;
        }
    }
    return $result;
}
READ ALSO
Не подключается повторно к базе данных

Не подключается повторно к базе данных

В программе база данных MYSQL подключается несколько раз к нескольким страницамПроблема в том, что подключение успешно лишь для первой страницы,...

112
Разбор xlsx файла PHPExcel

Разбор xlsx файла PHPExcel

Всем здравствуйтеЕсть скрипт импорта данных в БД из Эксель таблицы

118
Проброс подключения к БД в функцию php [дубликат]

Проброс подключения к БД в функцию php [дубликат]

На данный вопрос уже ответили:

102