使用关联阵列根据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的响应毫无意义,但我猜您必须匹配tweet返回给相应用户的数据。


以下是我要做的

假设这将是理想的回报:

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"],获取Author ID,然后查看["includes"]["users"]中的ID,如果匹配,则合并其自己的对象数组。

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

如果我们可以将其全部合并到一个数组或对象中,那么我就不必对tweet密钥执行[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字段!

因此,首先我们为用户创建一个查找表(数组(,使我们能够将tweet上的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"
}
}
*/

最新更新