Страницы

Поиск по вопросам

воскресенье, 29 марта 2020 г.

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

#php #массивы


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

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))) {
    //Пишем массив который длиннее 
}


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


Ответы

Ответ 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; }

Комментариев нет:

Отправить комментарий