あなたの質問には2つの部分があるようです。最初の部分は、json_decode
によって返された2つのオブジェクトの出力をマージする方法です。 2番目の部分は、ServiceIdが一致した場合にのみそれらをマージする方法です。
パート1
json_decode
は、デフォルトでは、クラス\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
オブジェクトに2つの\StdClass
オブジェクトをマージしたい場合は、いくつかの賢明なキャストが必要です。それらをarray
にキャストし、マージしてから\StdClass
にキャストします。
これはちょっとしたことです。したがって、これらの作業を行えば、配列として作業することで利益を得ることができます。これは、アレイ全体の時間を動作
$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);
:json_decode
は、それが配列を返すように指示するオプションの二番目の引数を取ります。後で$c
を\StdClass
オブジェクトにする場合は、最初の例のように$c = (object)$c;
を使用してキャストできます。
See these live on 3v4l.org.
パートおそらく2
、あなたはその一緒に反復処理するか、そうでない場合はペアこれらのオブジェクトをいくつかのロジックが必要になるだろう。あなたは、ソースに言及しませんが、ロジックは次のようになります。
if ($a->ServiceId == $b->ServiceId) {
$c = (object)array_merge((array)$a, (array)$b)
}
あなたがオブジェクトのリストを持っている、とあなたは一緒にすべてをマージしたい場合は、あなたがのcombinatoric配列歩行動作を使用することができますusort
:
$merged = [];
usort($objects, function ($a, $b) use ($merged) {
$comp = strcmp($a->ServiceId, $b->ServiceId);
if (0 === $comp) {
$merged[] = (object)array_merge((array)$a, (array)$b)
}
return $comp;
});
var_dump($merged);
これは、オブジェクトのリストを反復して比較します。ServiceId
が一致すると、2つのオブジェクトがマージされ、マージされたリストに追加されます。これはあなたのリストにあるようにServiceId
を共有する多くのオブジェクトに対して発生します。あなたがオブジェクトを扱っているので、すべてのプロパティをマージすることである
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
@bishopこれらのオブジェクトはクラスからインスタンス化されません。これらはjson_decode()関数を使用して作成されます。 – Cowgirl
代わりに 'json_decode($ your_json、true)'を使い、 'array_merge'を試してください –