Как сгруппировать и подсчитать каждый элемент сериализованного массива?

Нужный мне плагин для Wordpress хранит список элементов в сериализованном массиве внутри поля в базе MySQL. Каждый пользователь имеет этот сериализованный массив в своей собственной таблице. Мне нужно подсчитать, сколько пользователей имеет один элемент сериализованного массива.

Например:

User_id | Value

123 | a:4:{i:0;s:3:”615“;i:1;s:3:”619“;i:2;s:3:”918“;i:3;s:3:”570“;}

12 | a:4:{i:0;s:3:”23“;i:1;s:3:”615“;i:2;s:3:”918“;}

143 | a:4:{i:0;s:3:”918“;i:1;s:3:”125“;}

Нужно получить и вывести:

918 – имеет 3 юзера

615 – имеет 2 юзера

619 – имеет 1 юзер

570 – имеет 1 юзер

125 – имеет 1 юзер

23 – имеет 1 юзер

Буду очень благодарен за помощь!


Ответы (1 шт):

Автор решения: Slava Rozhnev

Задача достаточно тривиальна.

  1. Забираем данные из базы
  2. Десериализуем и объединяем в один массив
  3. Считаем количество значений
    <?php
    $query = "SELECT * FROM Users;";
    $stmt = $pdo->prepare($query);
    $stmt->execute();
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    //Unserialize and join user arrays
    $count_users = array_reduce(
        $users,
        function($res, $u) {
            return array_merge($res, unserialize($u['Value']));
        },
        []
    );
    
    //Print count values
    print_r(array_count_values($count_users));

Test PHP array_reduce unserialize array_merge

→ Ссылка