使用关联数组根据ID合并两个对象

Use associative array to merge two objects based on ID

所以我有以下方法 $data = Twitter::get_profile_tweets() 输出以下响应:

object(stdClass)#1597 (3) {
  ["data"]=>
  array(5) {
    [0]=>
    object(stdClass)#1612 (4) {
      ["text"]=>
      string(231) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
      ["id"]=>
      string(19) "1487953501825163264"
      ["author_id"]=>
      string(19) "1487104761291849728"
    }
    [1]=>
    object(stdClass)#1586 (5) {
      ["attachments"]=>
      object(stdClass)#1606 (1) {
        ["media_keys"]=>
        array(1) {
          [0]=>
          string(22) "16_1487594952561467393"
        }
      }
      ["text"]=>
      string(56) "Telling myself how I really feel"
      ["id"]=>
      string(19) "1487594959125549059"
      ["author_id"]=>
      string(19) "1487104761291849728"
    }
  }
  ["includes"]=>
  object(stdClass)#1604 (2) {
    ["users"]=>
    array(1) {
      [0]=>
      object(stdClass)#1591 (9) {
        ["profile_image_url"]=>
        string(78) "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
        ["id"]=>
        string(19) "1487104761291849728"
        ["name"]=>
        string(14) "FHTechServices"
      }
    }
  }
}

API 响应没有意义,但我猜你必须将数据推文 return 与相应的用户匹配。


这是我正在尝试做的事情:

假设这是最理想的 return:

object(stdClass)#1597 (3) {
  array(2) {
    [0] => {
        [0] => {
            object(stdClass)#1612 (4) {
              ["text"]=>
              string(231) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
              ["id"]=>
              string(19) "1487953501825163264"
              ["author_id"]=>
              string(19) "1487104761291849728"
            }
        [1] => 
            object(stdClass)#1591 (9) {
              ["profile_image_url"]=>
              string(78) "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
              ["id"]=>
              string(19) "1487104761291849728"
              ["name"]=>
              string(14) "FHTechServices"
            }
        }
    }
    [1] => {
        [0] => {
            object(stdClass)#1612 (4) {
              ["text"]=>
              string(231) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
              ["id"]=>
              string(19) "1487953501825163264"
              ["author_id"]=>
              string(19) "1487104761291849728"
            }
        }
        [1] => {
            object(stdClass)#1591 (9) {
              ["profile_image_url"]=>
              string(78) "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
              ["id"]=>
              string(19) "1487104761291849728"
              ["name"]=>
              string(14) "FHTechServices"
            }
        }
    }
  }
}

我们查看了第一个索引中的 ["data"] 并获取了作者 ID,然后查看了 ["includes"]["users"] 中的 ID,如果匹配,则合并其自己的对象数组。

不确定以下内容,因为可能存在键冲突:

如果我们可以将它们全部合并到一个数组或对象中会怎么样,这样我就不必为推文键做 [0] 和为用户键做 [1],我可以循环并抓住钥匙,例如:

[0] => {
    [0] => {
        object(stdClass)#1612 (4) {
          ["text"]=>
          string(231) "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
          ["id"]=>
          string(19) "1487953501825163264"
          ["author_id"]=>
          string(19) "1487104761291849728"
          ["profile_image_url"]=>
          string(78) "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png"
          ["id"]=>
          string(19) "1487104761291849728"
          ["name"]=>
          string(14) "FHTechServices"
        }
    }
}

这听起来非常令人困惑,因此非常感谢所有帮助!

您请求的输出包含 2 个 ID 字段,实际上只需要 ID 和 author_id。

在组合对象上,我们需要将用户的 ID 字段映射到推文中的作者 ID 字段!

因此,首先我们对我们的用户进行查找 table(数组),这样我们就可以将推文上的 author_id 映射到用户的 id 字段。

然后当我们循环浏览我们的推文时,我们可以根据需要添加用户详细信息。

<?php

$twitter_data = (object) [
    'data' => [
        (object) [
            'text' => "Follow DataTongue on twitter",
            'id' => "1487953501825163264",
            'author_id' => "14871047612917656543",
        ],

        (object) [
            'text' => "My name is Keith Ismael",
            'id' => "1487953501825112346",
            'author_id' => "14871047612918412345",
        ],

        (object) [
            'text' => "My name is Paul Malvino",
            'id' => "1487953501825198765",
            'author_id' => "14871047612918469875",
        ],
    ],

    'includes' => (object) [
        'users' => [
            (object) [
                'profile_image_url' => "https://example.com",
                'id' => "14871047612918469875",
                'name' => "Paul Malvino",
            ],
            (object) [
                'profile_image_url' => "https://example.com",
                'id' => "14871047612918412345",
                'name' => "Keith Ismael",
            ],
            (object) [
                'profile_image_url' => "https://example.com",
                'id' => "14871047612917656543",
                'name' => "Sally Pemdas",
            ],
        ],
    ]   
];

function mergeTweetsWithUsers ($merge_me) {
    $users_lookup = [];
    $combined_output = [];
    
    foreach ($merge_me->includes->users as $key => $user) {
        $users_lookup[$user->id] = $user;
    }

    foreach ($merge_me->data as $tweet) {
        $merged_tweet = $tweet;
        $merged_tweet->author_name = $users_lookup[$tweet->author_id]->name;
        $merged_tweet->author_profile_image_url = $users_lookup[$tweet->author_id]->profile_image_url;

        $combined_output[] = $merged_tweet;
    }

    return $combined_output;
}

mergeTweetsWithUsers($twitter_data);

/*
array(3) {
  [0]=>
  object(stdClass)#1 (5) {
    ["text"]=>
    string(28) "Follow DataTongue on twitter"
    ["id"]=>
    string(19) "1487953501825163264"
    ["author_id"]=>
    string(20) "14871047612917656543"
    ["author_name"]=>
    string(12) "Sally Pemdas"
    ["author_profile_image_url"]=>
    string(19) "https://example.com"
  }
  [1]=>
  object(stdClass)#2 (5) {
    ["text"]=>
    string(23) "My name is Keith Ismael"
    ["id"]=>
    string(19) "1487953501825112346"
    ["author_id"]=>
    string(20) "14871047612918412345"
    ["author_name"]=>
    string(12) "Keith Ismael"
    ["author_profile_image_url"]=>
    string(19) "https://example.com"
  }
  [2]=>
  object(stdClass)#3 (5) {
    ["text"]=>
    string(23) "My name is Paul Malvino"
    ["id"]=>
    string(19) "1487953501825198765"
    ["author_id"]=>
    string(20) "14871047612918469875"
    ["author_name"]=>
    string(12) "Paul Malvino"
    ["author_profile_image_url"]=>
    string(19) "https://example.com"
  }
}

*/