Работа с двумя многомерными массивами в цикле


Подскажите пожалуйста как вывести количество сообщений от 1 пользователя другому. Есть многомерный массив пользователей с новыми сообщениями

$nonReadMessages - многомерный массив пользователей с новыми сообщениями

Array
(
    [0] => Array
        (
            [id] => 3
            [nick] => пользователь3
        )

    [1] => Array
        (
            [id] => 4
            [nick] => пользователь4
        )

)

Так же есть второй многомерный массив с количеством сообщений от каждого пользователя


$nonReadMessagesCount - многомерный массив с количеством сообщений от каждого пользователя

Array
(
    [0] => Array
        (
            [id] => 3
            [flag] => 0
        )

    [1] => Array
        (
            [id] => 4
            [flag] => 0
        )

    [2] => Array
        (
            [id] => 4
            [flag] => 0
        )

    [3] => Array
        (
            [id] => 4
            [flag] => 0
        )

)

получается что у пользователя с id=3 всего одно сообщение, а у пользователя с id=4 целых 3 сообщения.

У меня есть цикл перебора многомерного массива пользователей с новыми сообщениями, он выглядит так

echo "<p>Новые сообщения:</p>";
        if (!empty($nonReadMessages)) {
            for ($i = 0; $i < count($nonReadMessages); $i++) {

                $id = $nonReadMessages[$i]['id'];

                echo "<p><a href='/message/$id'>" . $nonReadMessages[$i]['nick'] . " " . "(" . $countMessages . ")" . "</a></p>";

            }
        }

Результат данного цикла вывод список пользователей с новыми сообщениями

пользователь3 ($countMessages)
пользователь4 ($countMessages)

Соотвественно я не могу посчитать переменную $countMessages для каждого пользователя, последнее что я делал это в теле цикла организовывал еще один цикл foreach($nonReadMessagesCount as $row) { $countMessages[$row['id']]++; } Я учусь и поэтому даже не могу понять возможно ли так соединить массивы или вернее будет вообще переделать код так что бы был один массив? Тогда подскажите как бы вы сделали такой вывод? Спасибо и будьте здоровы!


0

Во втором массиве ключ flag везде равен нулю, так должно быть?

0

Да, это значит что сообщение не прочитано

Ответов: 1


Alex Khonko

/// шаг 1 => сделайте ключи массива такие же как id
$a = [
   3 =>  [
        'id' => 3,
        'nick' => 'test1',
    ],
    4 => [
        'id' => 4,
        'nick' => 'test2',
    ]
];

/// 2 где-то в глубине кода(или класса) лучше пометить точное определение
/// unreadable
const MESSAGE_READ = 1;
const MESSAGE_UNREAD = 0;

$b = [
    [
        'id' => 3,
        'flag' => 0,
    ],
    [
        'id' => 4,
        'flag' => 0,
    ],
    [
        'id' => 4,
        'flag' => 0,
    ],
    [
        'id' => 4,
        'flag' => 0,
    ],
];

/// 3 к-во непрочитанных сообщений для каждого юзера -
/// отдельная сфера ответственности, которую тоже лучше вынести отдельно
/// например, у вас может быть таблица M:M с данными,
/// у кого сколько прочитано, непрочитано
$c = [];

foreach ($b as $message)
{
    if($message['flag'] == MESSAGE_UNREAD)
    {
        $count = $c[$message['id']]['unreadCount'] ?? 0;
        $count++;
        $c[$message['id']]['unreadCount'] = $count;
    }
}
var_dump($c);


0

Благодарю, буду пробовать!

задан
4 дня 15 часов назад
просмотрен
21