2017-10-20 82 views
0

有簡單的JSONPHP創建多維JSON

{"level1_level2_blah": "some value", "level1_level_2 ... _level9999_blah": "hello world"} 

我想知道是否有一種方法將其轉換成JSON這樣的:

{"level1": {"level2": {"blah": "some value"}, ... }}} 

的尺寸(水平)的數量動態。我嘗試使用動態變量'名稱,構建單元素JSON字符串 - 解碼 - 合併。我認爲這些方法非常糟糕,但我沒有找到任何其他方法來做到這一點。沒關係,但這些方法甚至不能正常工作。

+0

你創建的第一個JSON自己呢?如果是的話,你應該從根開始並修復它。 –

+0

@ roland-starke不完全。它是一個自動生成的單維json(鍵值,鍵值...),不能被控制。 –

回答

0

您需要遞歸添加項目到生成的多維數組。就像這樣:

$output = []; 
$input = [ 
    'foo' => 'bar', 
    'a_b_c' => 'test', 
    'a_b_d' => 'foo', 
    'bar_foo' => 'taz', 
    'a_x_y_z_xiv' => '99', 
    'bar_bar_bar_bar_bar_bar_bar' => 'foo', 
    'a_b_e' => 'bar' 
]; 
function add_to_array(&$array, $key, $value) { 
    if (is_array($key) && sizeof($key) > 1) { 
     $keyPart = array_shift($key); 
     if (!array_key_exists($keyPart, $array)) { 
      $array[$keyPart] = []; 
     } 
     add_to_array($array[$keyPart], $key, $value); 
    } else { 
     $array[is_array($key)?$key[0]:$key] = $value; 
    } 
} 

foreach ($input as $key => $value) { 
    add_to_array($output, explode('_', $key), $value);  
} 
echo json_encode($output, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), PHP_EOL; 

結果

{ 
    "foo": "tar", 
    "a": { 
     "b": { 
      "c": "test", 
      "d": "foo", 
      "e": "bar" 
     }, 
     "x": { 
      "y": { 
       "z": { 
        "xiv": "99" 
       } 
      } 
     } 
    }, 
    "bar": { 
     "foo": "taz", 
     "bar": { 
      "bar": { 
       "bar": { 
        "bar": { 
         "bar": { 
          "bar": "foo" 
         } 
        } 
       } 
      } 
     } 
    } 
}