Пример массива:
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))) {
//Пишем массив который длиннее
}
Но не могу придумать как найти совпадения...
В итоге написал такую функцию:
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;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей