基于属性在PHP中合并对象
我最初尝试的是合并两个对象 我有一件像这样的东西基于属性在PHP中合并对象,php,arrays,object,merge,Php,Arrays,Object,Merge,我最初尝试的是合并两个对象 我有一件像这样的东西 {#23 ▼ +"Name": "Consultation" +"ServiceId": "1024" +"Price": ".00" } {#1 ▼ +"Name": "Consultation" +"ServiceId": "1024" +"Price": ".00" +"StartTime": "9:15AM" } 另一个物体 {#362 ▼ +"Start
{#23 ▼
+"Name": "Consultation"
+"ServiceId": "1024"
+"Price": ".00"
}
{#1 ▼
+"Name": "Consultation"
+"ServiceId": "1024"
+"Price": ".00"
+"StartTime": "9:15AM"
}
另一个物体
{#362 ▼
+"StartTime": "9:15AM"
+"ServiceId": "1024"
}
我正在寻找一种基于ServiceId合并这两个对象的方法,所以我得到一个这样的对象
{#23 ▼
+"Name": "Consultation"
+"ServiceId": "1024"
+"Price": ".00"
}
{#1 ▼
+"Name": "Consultation"
+"ServiceId": "1024"
+"Price": ".00"
+"StartTime": "9:15AM"
}
当然,如果两个对象之间的ServiceId不匹配,则不应合并
关于如何解决这个错误有什么想法吗?你的问题似乎有两个部分。第一部分是如何合并json_decode返回的两个对象的输出。第二部分是如何仅在ServiceId匹配时合并它们 第一部分 默认情况下,生成类\StdClass的对象。如果要将两个\StdClass对象合并为第三个\StdClass对象,则需要一些明智的强制转换:
$a = json_decode('{"Name":"Consultation", "ServiceId":"1024", "Price":".00"}');
$b = json_decode('{"StartTime": "9:15AM", "ServiceId": "1024"}');
$c = (object)array_merge((array)$a, (array)$b);
var_dump($c);
此处,$a和$b是\StdClass对象。将它们转换为数组、合并,然后再转换回\StdClass
这是一种迂回的方式。因此,您可以从一开始就将这些作为数组使用中获益。json_decode接受可选的第二个参数,该参数指示它返回数组:
$a = json_decode('{"Name":"Consultation", "ServiceId":"1024", "Price":".00"}', true);
$b = json_decode('{"StartTime": "9:15AM", "ServiceId": "1024"}', true);
$c = array_merge($a, $b);
var_dump($c);
这在阵列中始终有效。如果以后希望$c成为\StdClass对象,可以使用$c=object$c强制转换它;正如在第一个例子中所做的那样
第二部分
据推测,您将需要一些逻辑来迭代或以其他方式将这些对象配对在一起。您没有提到源代码,但逻辑如下所示:
if ($a->ServiceId == $b->ServiceId) {
$c = (object)array_merge((array)$a, (array)$b)
}
如果您有一个对象列表,并且希望将它们全部合并在一起,则可以使用以下组合数组遍历行为:
这将遍历对象列表,比较每个对象。如果ServiceId匹配,那么它将合并两个对象并将其添加到合并的对象列表中。共享ServiceId的对象的数量与列表中的相同,这将发生。这里的想法是在1个数组中循环,并在另一个数组中找到与当前数组匹配的假定1元素:
foreach ($array1 as $key => $item) {
$other = array_filter($array2, function ($item2) use ($item) {
return $item2->ServiceId == $item->ServiceId;
});
if (!empty($other)) {
$item->StartTime = current($other)->SomethingElse;
}
}
因为处理对象合并所有属性有点棘手
下面是一个例子:
您的对象是什么类?@bishop这些对象不是从类实例化的,它们是使用json_decode函数生成的。而是使用json_decode$your_json,true,然后尝试array_merge。您有多个对象的数组,或者每个数组中只有一个对象?有多个对象的数组,但是我循环使用它来获取一个对象并尝试比较它们谢谢,但这实际上不起作用它只是合并了两个对象而不考虑属性,并且它不是基于服务的,因为你问的是一个两部分的问题,但只给出了一部分的足够信息。很抱歉混淆,事实上,我试图找到的主要功能是根据一个属性将两个对象配对在一起,这个属性是我的问题的主要标题。好吧,让这次更新来一次。如果它不起作用,发布更多关于对象列表的信息,您希望如何遍历它们,以及预期的输出。