Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于属性在PHP中合并对象_Php_Arrays_Object_Merge - Fatal编程技术网

基于属性在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。您有多个对象的数组,或者每个数组中只有一个对象?有多个对象的数组,但是我循环使用它来获取一个对象并尝试比较它们谢谢,但这实际上不起作用它只是合并了两个对象而不考虑属性,并且它不是基于服务的,因为你问的是一个两部分的问题,但只给出了一部分的足够信息。很抱歉混淆,事实上,我试图找到的主要功能是根据一个属性将两个对象配对在一起,这个属性是我的问题的主要标题。好吧,让这次更新来一次。如果它不起作用,发布更多关于对象列表的信息,您希望如何遍历它们,以及预期的输出。