2016-04-04 9 views
1

私はまっすぐ進む作業になると予想していたものを解決するのにあまりにも多くの時間をかけた後、明白な欠陥を見逃しているか、 。新しい値を持つ繰り返しオブジェクトのPHP配列の再構築

私の実際のデータははるかに複雑ですが、私はこの例に簡略化しました。

のは、私は、配列オブジェクトの$my_arrayを持っているとしましょう:

$object1 = new stdClass(); 
    $object1->valueA = 'abc'; 
    $object1->valueB = 'def'; 
    $object1->valueC = '20160410'; 
$object2 = new stdClass(); 
    $object2->valueA = '123'; 
    $object2->valueB = '456'; 
    $object2->valueC = '20160408'; 
$object3 = new stdClass(); 
    $object3->valueA = 'foo'; 
    $object3->valueB = 'bar'; 
    $object3->valueC = '20160412'; 

$my_array = array(
    'X' => $object1, 
    'Y' => $object2, 
    'Z' => $object3 
); 

私は、各オブジェクトを介して行きたい、新しいプロパティを計算し、その値のいずれかを使用し、使用して、新しい配列にオブジェクトを割り当てますそれをグループ化する新しい計算値。

私はこのようにそれをやった

$new_array= array(); 
foreach($my_array as $key=>$obj){ 
    for($i=0;$i<=2;$i++){ //the real use case uses a slightly different loop, this is simpler/shorter for an example 
     $date = $obj->valueC + $i; //use valueC and the loop to calculate a new value 
     $obj->date = $date; //add my new value to the object 
     $new_array[$date][$key] = $obj; //construct new array of arrays of objects. bits on bits on bytes. 
    } 
} 

私はコンソールへの結果の配列を記録している場合、それは次のようになります。今

[04-Apr-2016 22:09:28 UTC] Array 
(
    [20160410] => Array 
     (
      [X] => stdClass Object 
       (
        [valueA] => abc 
        [valueB] => def 
        [valueC] => 20160410 
        [date] => 20160412 
       ) 

      [Y] => stdClass Object 
       (
        [valueA] => 123 
        [valueB] => 456 
        [valueC] => 20160408 
        [date] => 20160410 
       ) 

     ) 

    [20160411] => Array 
     (
      [X] => stdClass Object 
       (
        [valueA] => abc 
        [valueB] => def 
        [valueC] => 20160410 
        [date] => 20160412 
       ) 

     ) 

    [20160412] => Array 
     (
      [X] => stdClass Object 
       (
        [valueA] => abc 
        [valueB] => def 
        [valueC] => 20160410 
        [date] => 20160412 
       ) 

      [Z] => stdClass Object 
       (
        [valueA] => foo 
        [valueB] => bar 
        [valueC] => 20160412 
        [date] => 20160414 
       ) 

     ) 

    [20160408] => Array 
     (
      [Y] => stdClass Object 
       (
        [valueA] => 123 
        [valueB] => 456 
        [valueC] => 20160408 
        [date] => 20160410 
       ) 

     ) 

    [20160409] => Array 
     (
      [Y] => stdClass Object 
       (
        [valueA] => 123 
        [valueB] => 456 
        [valueC] => 20160408 
        [date] => 20160410 
       ) 

     ) 

    [20160413] => Array 
     (
      [Z] => stdClass Object 
       (
        [valueA] => foo 
        [valueB] => bar 
        [valueC] => 20160412 
        [date] => 20160414 
       ) 

     ) 

    [20160414] => Array 
     (
      [Z] => stdClass Object 
       (
        [valueA] => foo 
        [valueB] => bar 
        [valueC] => 20160412 
        [date] => 20160414 
       ) 

     ) 

) 

、私は$のnew_array [ '20160410']を期待['X'] - >日付は20160410になります。結局、2行の中で、私は "この値をトップレベルの配列キーとして使用し、オブジェクトの値としても使う"と言った。しかし、私が何をしても、['X']のすべてのインスタンスは同じdateの値を持ちます。 ['Y']および['Z']と同じです。

私の目的は、新たに計算されたdate値をオブジェクト内に格納し、その値をグループ化キーとして使用できるようにすることです。

+0

すべての値が配列のオブジェクトごとに同じであることに注意して始めました。次のステップは、コードで使用するすべてのマニュアルをマニュアルで確認することでした。 – Rizier123

+0

これは、データがリレーショナルデータベースにあった場合には些細なことです。 – symcbean

答えて

3

オブジェクトは、あなたがmanualでそれにそれを読むことができるよう、デフォルトで参照することによって割り当てられます:

しばしば言及されているPHP 5 OOPのキーポイントの1つは、「オブジェクトがで渡されるということですデフォルトでの参照 "

ですから、forループであなたの割り当てを想像することができます。このような

$new_array[$date][$key] = $obj; 

$new_array[$date][$key] = &$obj; 
          ↑ 

をこれは、あなたがすべてのオブジェクトにするループのすべての反復を更新することを意味します。これをただ解決するために、cloneオブジェクト、例えば。

$new_array[$date][$key] = clone $obj;
+0

うわー - あなたは私がオブジェクトについて持ってきた長年の誤解を取り除きました。そして、私が直前には考えていなかった多くの方法でそれらがどのように役立つかをすぐに見ることができます。私はこの2日前に私がデバッグに何時間も沈んでしまった前に投稿したかっただけです!次回は、RT RTアプローチを試してみます。ありがとう! –

+0

@AndrewCafourekあなたが長い間デバッグするのは悪いことではありません。たぶん次回は、コードで使用するすべてのことについてマニュアルを読むことを始めます;) – Rizier123

関連する問題