중첩 된 키-값 쌍을 기반으로 고유 한 연관 배열 가져 오기

Markus Proctor

내 앱에 메시징 시스템이 있고 사용자가 읽고 싶은 대화를 선택할 수있는 메뉴를 제공하는 가장 좋은 방법을 찾으려고 노력하고 있습니다. 왼쪽에 대화가있는 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
        )
)

이것에 대한 지침을 제공하는 사람이 있습니까? 나는 StackOverflow에 대한 응답과 함께 연관 배열의 배열에서 하나의 속성의 고유 값을 얻으 려고 시도했지만 $key메시지의 ID 인 배열을 잃었습니다 .

SirPilan

이 솔루션을 살펴보십시오 : https://3v4l.org/msUPQ

명확하지 않은 경우 코드를 따라 몇 가지 주석을 추가했습니다. :)

제공된 $data것이 가장 최근의 순서 (사양에 따라) 인 한 작동합니다.

<?php

declare(strict_types=1);

$data = [
    '-MC1kTfrrDHY3ZbidJ4Q' => [
        'from' => 'lSUfZ4sgEJd',
        'message' => 'test message four no more!',
        'startedAt' => '2020-07-12 11:21:10',
        'to' => 'CWgPqdn3YweN',
    ],
    '-MC09BsjtXP0izITsThf' => [
        'from' => 'CWgPqdn3YweN',
        'message' => 'test message three',
        'startedAt' => '2020-07-11 11:20:19',
        'subject' => '-MC00BHCZlXUp25C5nlS',
        'to' => 'lSUfZ4sgEJd',
    ],
    '-MC1kAi1niswXtjY_h4s' => [
        'from' => 'CWgPqdn3YweN',
        'message' => 'test message two',
        'startedAt' => '2020-07-12 11:19:52',
        'to' => 'lSUfZ4sgEJd',
    ],
    '-MC1kOtfnIlAYtmJsD-a' => [
        'from' => 'CWgPqdn3YweN',
        'message' => 'test message one',
        'startedAt' => '2020-07-12 11:18:50',
        'to' => 'lSUfZ4sgEJd',
    ],
    '-MC1kOtfnIlAhgcufu' => [
        'from' => 'CWgPqdn3YweN',
        'message' => 'test message zero',
        'startedAt' => '2020-07-12 11:00:50',
        'to' => 'YLisXjk07w93',
    ],
];

function getLatestUniqueConversationMessagesByUser(array $message, string $user): array
{
    $conversations = [];
    $latestUniqueConversationMessages = [];
    
    foreach ($message as $messageKey => $message) {
        $participants = [$message['from'], $message['to']];
        
        // Skip entries where $user is has not participated (not sure if needed)
        if (!in_array($user, $participants)) { continue; }
        
        // Make "to|from" same as "from|to"
        sort($participants);
        $conversationKey = join('|', $participants);
        
        // Check if conversation has been handled already
        if (!array_key_exists($conversationKey, $conversations)) {
            $conversations[$conversationKey] = true; // Save as "handled"
            $latestUniqueConversationMessages[$messageKey] = $message; // Save actual data to return
        }
    }
    
    return $latestUniqueConversationMessages;
}

var_dump(getLatestUniqueConversationMessagesByUser($data, 'CWgPqdn3YweN'));

산출:

array(2) {
  ["-MC1kTfrrDHY3ZbidJ4Q"]=>
  array(4) {
    ["from"]=>
    string(11) "lSUfZ4sgEJd"
    ["message"]=>
    string(26) "test message four no more!"
    ["startedAt"]=>
    string(19) "2020-07-12 11:21:10"
    ["to"]=>
    string(12) "CWgPqdn3YweN"
  }
  ["-MC1kOtfnIlAhgcufu"]=>
  array(4) {
    ["from"]=>
    string(12) "CWgPqdn3YweN"
    ["message"]=>
    string(17) "test message zero"
    ["startedAt"]=>
    string(19) "2020-07-12 11:00:50"
    ["to"]=>
    string(12) "YLisXjk07w93"
  }
}

배열 함수를 사용하는 대안 (읽을 수 없음) :

$messageKeys = 
    array_keys(
        array_unique(
            array_map(
                function ($message) {
                    $participants = [$message['from'], $message['to']];
                    sort($participants);
                    return join('|', $participants);
                },
                $data
            )
        )
    );

var_dump(
    array_filter(
        $data,
        function ($key) use ($messageKeys) {
            return in_array($key, $messageKeys);
        },
        ARRAY_FILTER_USE_KEY
    )
);

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

복합 기본 키를 기반으로 고유 한 열 값 가져 오기

분류에서Dev

중첩 된 값을 유형으로 가져 오기

분류에서Dev

특정 키의 값을 기반으로 한 고유 배열

분류에서Dev

중첩 된 객체 배열 값을 다른 배열로 가져 오기

분류에서Dev

연관 배열에있는 경우 여러 특정 키 값 쌍 가져 오기

분류에서Dev

목록 내 중첩 된 사전에서 고유 값의 키 가져 오기

분류에서Dev

JSON 배열을 통한 PHP 루프 및 키 값 쌍 가져 오기

분류에서Dev

연관된 배열의 각 키에서 하나의 값 가져 오기

분류에서Dev

중첩 배열의 특정 키에 대한 각 값의 총량 가져 오기

분류에서Dev

Django Rest Framework : 중첩 된 구조에서 고유 한 값 목록 가져 오기

분류에서Dev

키 값 쌍이 포함 된 열을 고유 한 열로 확장

분류에서Dev

다른 열의 고유 한 값을 기반으로 한 열의 고유 한 값을 가져 오는 방법

분류에서Dev

새 열이 중첩 된 If 수식을 기반으로 두 배가되는 값

분류에서Dev

중첩 된 배열 값 및 고유 개수를 기반으로 문서 일치

분류에서Dev

Javascript-연관 배열 키 값 가져 오기

분류에서Dev

고유 한 열을 기반으로 단일 행 가져 오기

분류에서Dev

중첩 된 배열을 상위 개체의 키 값 쌍으로 매핑

분류에서Dev

중첩 된 json 배열에서 값 가져 오기

분류에서Dev

TypeScript : Tupel을 기반으로 중첩 된 속성 유형 가져 오기

분류에서Dev

비슷한 값을 가진 배열 가져 오기 키

분류에서Dev

Cosmos SQL에서 그룹화 된 (고유 한?!?) 값 배열 가져 오기

분류에서Dev

Swift에서 복잡한 중첩 사전 / 배열 조합에 대한 키 값 가져 오기

분류에서Dev

JSON 배열의 중첩 된 객체에서 모든 키 및 해당 값 가져 오기 (jQuery 제외)

분류에서Dev

깊은 중첩 키로 중복 항목을 매핑 한 후 전체 개체 배열 가져 오기

분류에서Dev

Mongo DB 중첩 배열에서 고유 한 값을 가져와 단일 배열로 출력

분류에서Dev

중첩 된 배열을 기반으로 한 개체 배열 필터링 문제

분류에서Dev

중첩 된 JSON에서 키 값 가져 오기

분류에서Dev

중첩 된 사전에서 키 값 가져 오기

분류에서Dev

mongoDB 값에 관계없이 중첩 된 값 가져 오기

Related 관련 기사

  1. 1

    복합 기본 키를 기반으로 고유 한 열 값 가져 오기

  2. 2

    중첩 된 값을 유형으로 가져 오기

  3. 3

    특정 키의 값을 기반으로 한 고유 배열

  4. 4

    중첩 된 객체 배열 값을 다른 배열로 가져 오기

  5. 5

    연관 배열에있는 경우 여러 특정 키 값 쌍 가져 오기

  6. 6

    목록 내 중첩 된 사전에서 고유 값의 키 가져 오기

  7. 7

    JSON 배열을 통한 PHP 루프 및 키 값 쌍 가져 오기

  8. 8

    연관된 배열의 각 키에서 하나의 값 가져 오기

  9. 9

    중첩 배열의 특정 키에 대한 각 값의 총량 가져 오기

  10. 10

    Django Rest Framework : 중첩 된 구조에서 고유 한 값 목록 가져 오기

  11. 11

    키 값 쌍이 포함 된 열을 고유 한 열로 확장

  12. 12

    다른 열의 고유 한 값을 기반으로 한 열의 고유 한 값을 가져 오는 방법

  13. 13

    새 열이 중첩 된 If 수식을 기반으로 두 배가되는 값

  14. 14

    중첩 된 배열 값 및 고유 개수를 기반으로 문서 일치

  15. 15

    Javascript-연관 배열 키 값 가져 오기

  16. 16

    고유 한 열을 기반으로 단일 행 가져 오기

  17. 17

    중첩 된 배열을 상위 개체의 키 값 쌍으로 매핑

  18. 18

    중첩 된 json 배열에서 값 가져 오기

  19. 19

    TypeScript : Tupel을 기반으로 중첩 된 속성 유형 가져 오기

  20. 20

    비슷한 값을 가진 배열 가져 오기 키

  21. 21

    Cosmos SQL에서 그룹화 된 (고유 한?!?) 값 배열 가져 오기

  22. 22

    Swift에서 복잡한 중첩 사전 / 배열 조합에 대한 키 값 가져 오기

  23. 23

    JSON 배열의 중첩 된 객체에서 모든 키 및 해당 값 가져 오기 (jQuery 제외)

  24. 24

    깊은 중첩 키로 중복 항목을 매핑 한 후 전체 개체 배열 가져 오기

  25. 25

    Mongo DB 중첩 배열에서 고유 한 값을 가져와 단일 배열로 출력

  26. 26

    중첩 된 배열을 기반으로 한 개체 배열 필터링 문제

  27. 27

    중첩 된 JSON에서 키 값 가져 오기

  28. 28

    중첩 된 사전에서 키 값 가져 오기

  29. 29

    mongoDB 값에 관계없이 중첩 된 값 가져 오기

뜨겁다태그

보관