If you don't want to lose duplicates, and you're ok, with having the values in the flipped array in an array as well, you may use this:
PHP 7.4 - ^8
<?php
function array_flip_safe(array $array) : array
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
$carry[$array[$key]] ??= [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>
PHP 7.0 - ^7.3 (Time to upgrade to PHP 8 ^^)
<?php
function array_flip_safe(array $array) : array
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
$carry[$array[$key]] = $carry[$array[$key]] ?? [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>
PHP 5.4 - ^5.6 (Just don't)
<?php
function array_flip_safe(array $array)
{
return array_reduce(array_keys($array), function ($carry, $key) use (&$array) {
if (!isset($carry[$array[$key]])
$carry[$array[$key]] = [];
$carry[$array[$key]][] = $key;
return $carry;
}, []);
}
?>