#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; }
Комментариев нет:
Отправить комментарий