猿问

根据嵌套键值对获取不同的关联数组

我的应用程序中有一个消息系统,我正在绞尽脑汁地试图找出为用户提供一个菜单来选择他们想要阅读的对话的最佳方法。我正在尝试镜像 GroupMe 样式菜单,左侧是您的对话。该对话列表是动态的,因此最近的对话位于顶部,并在您使用该应用程序时更新。


我正在使用 Laravel 7 和 Firebase


这是我后端的数据(经过美化)


Array

(

    [-MC1kTfrrDHY3ZbidJ4Q] => Array

        (

            [from] => lSUfZ4sgEJd

            [message] => test message four no more!

            [startedAt] => 2020-07-12 11:21:10

            [to] => CWgPqdn3YweN

        )


    [-MC09BsjtXP0izITsThf] => Array

        (

            [from] => CWgPqdn3YweN

            [message] => test message three

            [startedAt] => 2020-07-11 11:20:19

            [subject] => -MC00BHCZlXUp25C5nlS

            [to] => lSUfZ4sgEJd

        )


    [-MC1kAi1niswXtjY_h4s] => Array

        (

            [from] => CWgPqdn3YweN

            [message] => test message two

            [startedAt] => 2020-07-12 11:19:52

            [to] => lSUfZ4sgEJd

        )


    [-MC1kOtfnIlAYtmJsD-a] => Array

        (

            [from] => CWgPqdn3YweN

            [message] => test message one

            [startedAt] => 2020-07-12 11:18:50

            [to] => lSUfZ4sgEJd

        )

     [-MC1kOtfnIlAhgcufu] => Array

        (

            [from] => CWgPqdn3YweN

            [message] => test message zero

            [startedAt] => 2020-07-12 11:00:50

            [to] => YLisXjk07w93

        )

)

无论我是发送者还是接收者,我都希望获得最新、独特的对话。我想要的最终结果是这样的


Array

(

 [-MC1kTfrrDHY3ZbidJ4Q] => Array

        (

            [from] => lSUfZ4sgEJd

            [message] => test message four no more!

            [startedAt] => 2020-07-12 11:21:10

            [to] => CWgPqdn3YweN

        )

 [-MC1kOtfnIlAhgcufu] => Array

        (

            [from] => CWgPqdn3YweN

            [message] => test message zero

            [startedAt] => 2020-07-12 11:00:50

            [to] => YLisXjk07w93

        )

)

有人介意提供这方面的指导吗?



冉冉说
浏览 220回答 1
1回答

潇潇雨雨

看看这个解决方案: https:&nbsp;//3v4l.org/msUPQ我在代码中添加了一些注释,以防不清楚:)只要所提供的产品$data按最新的先订购(根据规格),就可以使用。<?phpdeclare(strict_types=1);$data = [&nbsp; &nbsp; '-MC1kTfrrDHY3ZbidJ4Q' => [&nbsp; &nbsp; &nbsp; &nbsp; 'from' => 'lSUfZ4sgEJd',&nbsp; &nbsp; &nbsp; &nbsp; 'message' => 'test message four no more!',&nbsp; &nbsp; &nbsp; &nbsp; 'startedAt' => '2020-07-12 11:21:10',&nbsp; &nbsp; &nbsp; &nbsp; 'to' => 'CWgPqdn3YweN',&nbsp; &nbsp; ],&nbsp; &nbsp; '-MC09BsjtXP0izITsThf' => [&nbsp; &nbsp; &nbsp; &nbsp; 'from' => 'CWgPqdn3YweN',&nbsp; &nbsp; &nbsp; &nbsp; 'message' => 'test message three',&nbsp; &nbsp; &nbsp; &nbsp; 'startedAt' => '2020-07-11 11:20:19',&nbsp; &nbsp; &nbsp; &nbsp; 'subject' => '-MC00BHCZlXUp25C5nlS',&nbsp; &nbsp; &nbsp; &nbsp; 'to' => 'lSUfZ4sgEJd',&nbsp; &nbsp; ],&nbsp; &nbsp; '-MC1kAi1niswXtjY_h4s' => [&nbsp; &nbsp; &nbsp; &nbsp; 'from' => 'CWgPqdn3YweN',&nbsp; &nbsp; &nbsp; &nbsp; 'message' => 'test message two',&nbsp; &nbsp; &nbsp; &nbsp; 'startedAt' => '2020-07-12 11:19:52',&nbsp; &nbsp; &nbsp; &nbsp; 'to' => 'lSUfZ4sgEJd',&nbsp; &nbsp; ],&nbsp; &nbsp; '-MC1kOtfnIlAYtmJsD-a' => [&nbsp; &nbsp; &nbsp; &nbsp; 'from' => 'CWgPqdn3YweN',&nbsp; &nbsp; &nbsp; &nbsp; 'message' => 'test message one',&nbsp; &nbsp; &nbsp; &nbsp; 'startedAt' => '2020-07-12 11:18:50',&nbsp; &nbsp; &nbsp; &nbsp; 'to' => 'lSUfZ4sgEJd',&nbsp; &nbsp; ],&nbsp; &nbsp; '-MC1kOtfnIlAhgcufu' => [&nbsp; &nbsp; &nbsp; &nbsp; 'from' => 'CWgPqdn3YweN',&nbsp; &nbsp; &nbsp; &nbsp; 'message' => 'test message zero',&nbsp; &nbsp; &nbsp; &nbsp; 'startedAt' => '2020-07-12 11:00:50',&nbsp; &nbsp; &nbsp; &nbsp; 'to' => 'YLisXjk07w93',&nbsp; &nbsp; ],];function getLatestUniqueConversationMessagesByUser(array $message, string $user): array{&nbsp; &nbsp; $conversations = [];&nbsp; &nbsp; $latestUniqueConversationMessages = [];&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; foreach ($message as $messageKey => $message) {&nbsp; &nbsp; &nbsp; &nbsp; $participants = [$message['from'], $message['to']];&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // Skip entries where $user is has not participated (not sure if needed)&nbsp; &nbsp; &nbsp; &nbsp; if (!in_array($user, $participants)) { continue; }&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // Make "to|from" same as "from|to"&nbsp; &nbsp; &nbsp; &nbsp; sort($participants);&nbsp; &nbsp; &nbsp; &nbsp; $conversationKey = join('|', $participants);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // Check if conversation has been handled already&nbsp; &nbsp; &nbsp; &nbsp; if (!array_key_exists($conversationKey, $conversations)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $conversations[$conversationKey] = true; // Save as "handled"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $latestUniqueConversationMessages[$messageKey] = $message; // Save actual data to return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; return $latestUniqueConversationMessages;}var_dump(getLatestUniqueConversationMessagesByUser($data, 'CWgPqdn3YweN'));输出:array(2) {&nbsp; ["-MC1kTfrrDHY3ZbidJ4Q"]=>&nbsp; array(4) {&nbsp; &nbsp; ["from"]=>&nbsp; &nbsp; string(11) "lSUfZ4sgEJd"&nbsp; &nbsp; ["message"]=>&nbsp; &nbsp; string(26) "test message four no more!"&nbsp; &nbsp; ["startedAt"]=>&nbsp; &nbsp; string(19) "2020-07-12 11:21:10"&nbsp; &nbsp; ["to"]=>&nbsp; &nbsp; string(12) "CWgPqdn3YweN"&nbsp; }&nbsp; ["-MC1kOtfnIlAhgcufu"]=>&nbsp; array(4) {&nbsp; &nbsp; ["from"]=>&nbsp; &nbsp; string(12) "CWgPqdn3YweN"&nbsp; &nbsp; ["message"]=>&nbsp; &nbsp; string(17) "test message zero"&nbsp; &nbsp; ["startedAt"]=>&nbsp; &nbsp; string(19) "2020-07-12 11:00:50"&nbsp; &nbsp; ["to"]=>&nbsp; &nbsp; string(12) "YLisXjk07w93"&nbsp; }}使用数组函数的替代方案(不那么可读):$messageKeys =&nbsp;&nbsp; &nbsp; array_keys(&nbsp; &nbsp; &nbsp; &nbsp; array_unique(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array_map(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; function ($message) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $participants = [$message['from'], $message['to']];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sort($participants);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return join('|', $participants);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $data&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; );var_dump(&nbsp; &nbsp; array_filter(&nbsp; &nbsp; &nbsp; &nbsp; $data,&nbsp; &nbsp; &nbsp; &nbsp; function ($key) use ($messageKeys) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return in_array($key, $messageKeys);&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; ARRAY_FILTER_USE_KEY&nbsp; &nbsp; ));
随时随地看视频慕课网APP
我要回答