2009-11-11 19 views
6

Birkaç json nesnesini birleştirmek ve daha sonra yeniden kodlamak için json_decode kullanmaya çalışıyorum. ben bu json nesneleri birkaç var ve her böyle bir şey çekmenin tek "bölüt" diziler birleştirmek istiyoruzPHP json_decode soru

{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
} 

: gibi benim json görünüyor şu anda

{ 
    "segment": [ 
     { 
      "id": 7, 
      "name": "test1" 
     }, 
     { 
      "id": 4, 
      "name": "test2" 
     } 
    ], 
    "segment": [ 
     { 
      "id": 5, 
      "name": "test3" 
     }, 
     { 
      "id": 8, 
      "name": "test4" 
     } 
    ] 
} 

benim php kodu, jsonun kodunu çözüyorum, her "segment" dizisini bir dizeye kaydediyorum ve sonra jsonu kodluyorum. ne zaman bunu yapmak

public function handleJSON($json){ 
     $decodeData = json_decode($json); 
     $segment =$decodeData->core; 
     return $segment; 
} 

public function formatJSON(){ 
     $segments = ""; 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments .= handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

i bir hata alırsınız: Sınıf stdClass ait Nesne yüzden o zaman ben onları bir diziye saklamak kullanarak çalıştı dizeye

dönüştürülemedi:

public function formatJSON(){ 
     $segments = array(); 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments[$i] = handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

Bu sefer bir hata alamıyorum, ancak tüm birleşik json nesnesini dizi parantezlerinde saklıyor. JSON nesnesini bir dizide kapsüllenmeden nasıl iade edebilirim?

cevap

14

, assoc:

"DOĞRU, dönen nesneler ilişkilendirilebilir dizilerle çevrilecektir zaman"

Genelde stdClass sınıfından ziyade ilişkilendirici dizilerle başa çıkmanın daha kolay olduğunu görüyorum.

$str = '{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
}'; 
print "<pre>"; 
print_r(json_decode($str)); 
print "</pre>"; 
print "<pre>"; 
print_r(json_decode($str,true)); 
print "</pre>"; 

Bu, ilk sonra Nesne sürümünü ilişkisel dizi üretir: segmenti üyelerini yakala, ben olarak ilişkisel dizi deşifre, böyle bir şey yapmak yeni bir boş dizi oluşturmak düşünüyorum

stdClass Object 
(
    [core] => stdClass Object 
     (
      [segment] => Array 
       (
        [0] => stdClass Object 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => stdClass Object 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 
Array 
(
    [core] => Array 
     (
      [segment] => Array 
       (
        [0] => Array 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => Array 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 

ve Onları yeni boş diziye ekleyiniz. Yani: Artık

$segments = array(); 
// assuming you had a bunch of items in the $strings array 
foreach ($strings as $str) { 
    $item = json_decode($str,true); 
    $segments = array_merge($item['core']['segment], $segments); 
} 

, böyle json için bu kodlayabilirsiniz:

$final_json = json_encode(array('segments'=>$segments)); 
+1

Teşekkür! Bu çok yardımcı oldu onun saçma! – dtrainer45

+0

Sevindim yardımcı oldu! – artlung

2

Dış nesneniz "segment" adlı iki öğe içerir. Bu yasal JSON iken, aynı ada sahip iki farklı öğe ile bir PHP nesnesine sahip olmak mümkün değildir. Bir yaklaşım json_decode ikinci parametrenin yararlanmak olacağını düşünüyorum