2017-10-20 12 views
0

Il y a JSON simple,PHP création JSON multidimensionnelle

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

Je voudrais savoir s'il y a un moyen de le convertir en JSON comme ça:

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

Le nombre de dimensions (niveaux) est dynamique. J'ai essayé d'utiliser noms de variables dynamiques, construction json chaîne simple-élément - le décoder - fusionner. Je pense que ces méthodes sont vraiment horribles, mais je n'ai pas trouvé d'autres moyens de le faire. Ce serait bien, mais ces méthodes ne fonctionnaient même pas correctement.

+0

-vous créer le premier JSON-vous? Si oui, vous devriez commencer à la racine et y remédier. –

+0

@ Roland-starke pas exactement. C'est un json unidimensionnel auto-généré (valeur-clé, valeur-clé ...) et il ne peut pas être contrôlé. –

Répondre

0

Vous devez ajouter de manière récursive des éléments au tableau multidimensionnel résultant. Comme ceci:

$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; 

Résultats dans

{ 
    "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" 
         } 
        } 
       } 
      } 
     } 
    } 
}