2017-11-06 3 views
0

私はもともと二つのオブジェクトマージオブジェクト

私は1つのオブジェクトこの

{#23 ▼ 
    +"Name": "Consultation" 
    +"ServiceId": "1024" 
    +"Price": ".00" 
} 

のような別の目的を持っているマージされやろうとしています

{#362 ▼ 
    +"StartTime": "9:15AM" 
    +"ServiceId": "1024" 
} 

私はServiceIdに基づいてこれら2つのオブジェクトをマージする方法を探しているので、このような単一のオブジェクトが得られます

{#1 ▼ 
     +"Name": "Consultation" 
     +"ServiceId": "1024" 
     +"Price": ".00" 
     +"StartTime": "9:15AM" 
    } 

もちろん、2つのオブジェクト間のServiceIdが一致しない場合は、マージしないでください。

どのようにエラーを解決するためのアイデア?

+0

あなたのオブジェクトがどのようなクラスですか? – bishop

+0

@bishopこれらのオブジェクトはクラスからインスタンス化されません。これらはjson_decode()関数を使用して作成されます。 – Cowgirl

+1

代わりに 'json_decode($ your_json、true)'を使い、 'array_merge'を試してください –

答えて

1

あなたの質問には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; 
    } 
} 

+1

ありがとうございます。実際にはプロパティに関係なく2つのオブジェクトがマージされますが、ServiceIdには基づいていません – Cowgirl

+0

あなたは2つの部分の質問をしていますが、1つの部分について十分な情報しか与えていません。 – bishop

+0

混乱して申し訳ありませんが、私が見つけようとしている主な機能は、2つのオブジェクトをプロパティに基づいてペアにすることです(私の質問のメインタイトルです)。 – Cowgirl