2016-04-04 20 views
1

Düzgün bir görev olması beklenen şeyleri gidermek için çok fazla saat geçtikten sonra, açık bir kusuru kaçırdığımı veya çalışmanın nasıl hatalı bir zihinsel model oluşturduğuna inanıyorum .Yeni Değerli Tekrarlanan Nesnelerin PHP Dizisini Yeniden Yapılandırma

Gerçek verilerim çok daha karmaşıktır, ancak bu örnek için bunu basitleştirdim.

Ben yeni bir özellik hesaplamak için kendi değerlerinden birini kullanın, her nesnenin üzerinden gitmek istiyorum
$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 
); 

sonra kullanarak, yeni bir diziye nesneyi atayın:

ı nesneler dizisi $my_array var diyelim onları gruplandırmak için yeni hesap değeri.

Ben öyle yaptım: Ben Konsolu çıkan dizi oturum halinde

$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. 
    } 
} 

, bu şuna benzer:

[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 
       ) 

     ) 

) 

Şimdi, $ new_array beklenebilir [ '20160410'] ['X'] -> tarihin 20160410 olması. Sonuçta, 2 satır içinde, "bu değeri üst düzey dizi anahtarı olarak ve ayrıca nesnede değer olarak kullan" dedim. Ama ne yaparsam yapayım, ['X']'un tüm örnekleri aynı date değerine sahip olacak. ['Y'] ve ['Z'] için aynıdır.

Amacım, bu değeri gruplama anahtarı olarak kullanırken yeni hesaplanan date değerini saklayabilmektir.

+0

Fark ettiniz ki, tüm değerler dizinizin her nesnesi için aynıdır. Bir sonraki adım, kodunuzda kullandığınız her şeyin kılavuzlarını kontrol etmek olurdu. – Rizier123

+0

Veri ilişkisel bir veritabanında olsaydı, bu önemsiz olurdu. – symcbean

cevap

3

Nesneler Eğer manual bulmak o okuyabilmesi için varsayılan olarak referans olarak atanmış olsun: genellikle "nesneler tarafından geçirilen durumu sözkonusudur PHP 5 OOP anahtar noktalarının

Bir Varsayılan olarak "."

Yani döngü içinde atama tahmin edebilirsiniz: Böyle

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

:

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

Bu döngü için tüm nesneleri her yinelemesini güncelleyecektir gelir. Bunu sadece clone çözmek için, ör.

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

Vay - sadece nesneler hakkında sahip olduğum uzun süredir devam eden bir yanlış anlaşılmayı temizlediniz ve daha önce hiç düşünmediğim birçok yoldan nasıl yararlı olabileceğini hemen anlayabiliyorum. Keşke bunu 2 gün önce göndermiş olsaydım, o kadar çok saati hata ayıklamaya batırdım! Bir dahaki sefere belki ole RTFM yaklaşımını deneyeceğim. Teşekkürler! –

+0

@AndrewCafourek Uzun zamandır hata ayıklaması kötü bir şey değildir. Belki bir dahaki sefere kodda kullandığınız her şey hakkında kılavuzu okumaya başlayabilirsiniz;) – Rizier123

İlgili konular