Получить Удаленные / Дубликаты значений ключа из массива PHP - PullRequest
0 голосов
/ 25 ноября 2018

Прежде всего, это не дубликат, так как я не нашел никакой информации об этом.Мы можем успешно удалить дублирующиеся значения, используя следующее из массива , например:

 $messages=   Array ( 
        [0] => Array ( [user] => 2224 [sending_time] => 1536513903 [read_time] => 1536513941 [content] => sad [recipient_status] => read ) 
        [1] => Array ( [user] => 3310 [sending_time] => 1536513903 [read_time] => 1536513941 [content] => sad [recipient_status] => read ) 
        [2] => Array ( [user] => user1 [sending_time] => 1536513874 [read_time] => 1536567672 [content] => def [recipient_status] => read ) 
        [3] => Array ( [user] => user1 [sending_time] => 1536513532 [read_time] => 1536513745 [content] => abc [recipient_status] => read ) 
    )

Используя следующее, я могу удалить дубликаты (по ключу):

        $MSGS_array  = array();
        foreach ($messages as $message) {
            $MSGS_array[$message['user']] = $message;
        }

Но вопрос в том, как мне получить удаленное пользовательское значение ключа?

ИЛИ

Как получить все дубликаты, имеющие ключ user и их значений (ей) в массиве из указанного выше массива?

Ожидаемый результат:

Выходные данные должны содержать только удаленные /Дубликаты Как: (мне просто нужны дубликаты с ключом пользователь )

 $output=   Array (
        [0] => Array ( [user] => user1 ) 
        [1] => Array ( [user] => user1 ) 
 );

ИЛИ

 $output=   Array (
        [0] => Array ( [user] => user1 [sending_time] => 1536513874 [read_time] => 1536567672 [content] => def [recipient_status] => read ) 
        [1] => Array ( [user] => user1 [sending_time] => 1536513532 [read_time] => 1536513745 [content] => abc [recipient_status] => read ) 
 );

1 Ответ

0 голосов
/ 25 ноября 2018

Вот один из способов найти дубликаты сообщений.Сначала мы находим неуникальных пользователей, проверяя количество значений user.Затем мы фильтруем сообщения в $messages, проверяя, находится ли user в массиве неуникальных пользователей:

$non_unique_users = array_filter(array_count_values(array_column($messages, 'user')), function ($v) { return $v != 1; });
$duplicate_messages = array_filter($messages, function ($v) use($non_unique_users) { return array_key_exists($v['user'], $non_unique_users); });
print_r($duplicate_messages);

Вывод:

Array ( 
    [2] => Array ( [user] => user1 [sending_time] => 1536513874 [read_time] => 1536567672 [content] => def [recipient_status] => read ) 
    [3] => Array ( [user] => user1 [sending_time] => 1536513532 [read_time] => 1536513745 [content] => abc [recipient_status] => read ) 
)

Демонстрация включена3v4l.org

Обновление

Чтобы просто вернуть массив ключей user, вы можете применить array_map к массиву $duplicate_messages:

$duplicate_users = array_map(function ($v) { return array('user' => $v['user']); }, $duplicate_messages);

или вы можете получить его непосредственно из массивов $messages и $non_unique_users:

$duplicate_users = array_map(function ($v) use($non_unique_users) { if (array_key_exists($v['user'], $non_unique_users)) return array('user' => $v['user']); }, $duplicate_messages);

В обоих случаях выводом будет

Array ( 
    [2] => Array ( [user] => user1 ) 
    [3] => Array ( [user] => user1 ) 
)

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...