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