假设,我有休息的json:
{
"foo.bar": 1
}
我希望像这样保存:
$array["foo"]["bar"] = 1
但我也可以在字符串中包含2个以上的“参数”。例如:
{
"foo.bar.another_foo.another_bar": 1
}
我希望以同样的方式保存。
$array["foo"]["bar"]["another_foo"]["another_bar"] = 1
如果我不知道我有多少参数,我怎么能这样做?
答案 0 :(得分:1)
这远不是最好的解决方案,但我整天都在编程,所以我有点累,但我希望它能为你提供一些可以解决的问题,或者至少是一个可行的解决方案。< / p>
以下是其工作的IDE:click
这是代码:
$json = '{
"foo.bar": 1
}';
$decoded = json_decode($json, true);
$data = array();
foreach ($decoded as $key => $value) {
$keys = explode('.', $key);
$data[] = buildNestedArray($keys, $value);
}
print_r($data);
function buildNestedArray($keys, $value) {
$new = array();
foreach ($keys as $key) {
if (empty($new)) {
$new[$key] = $value;
} else {
array_walk_recursive($new, function(&$item) use ($key, $value) {
if ($item === $value) {
$item = array($key => $value);
}
});
}
}
return $new;
}
输出:
Array
(
[0] => Array
(
[foo] => Array
(
[bar] => 1
)
)
)
不确定你的JSON字符串是否有倍数,所以我让它处理前者。
希望它有所帮助,将来可能会回来并清理一下。
答案 1 :(得分:0)
然后构建一个foreach循环来拆分键并将它们传递给某种创建值的递归函数。
$old_stuff = json_decode($json_string);
$new_stuff = array();
foreach ($old_stuff AS $key => $value)
{
$parts = explode('.', $key);
create_parts($new_stuff, $parts, $value);
}
然后编写递归函数:
function create_parts(&$new_stuff, $parts, $value)
{
$part = array_shift($parts);
if (!array_key_exists($part, $new_stuff)
{
$new_stuff[$part] = array();
}
if (!empty($parts)
{
create_parts($new_stuff[$part], $parts, $value);
}
else
{
$new_stuff = $value;
}
}
我没有测试过这段代码,所以不要指望只是削减和过去,但战略应该有效。请注意,$ new_stuff是通过引用递归函数传递的。这非常重要。
答案 2 :(得分:0)
请尝试以下技巧进行&#34;重新格式化&#34;进入符合预期数组结构的json字符串:
$json = '{
"foo.bar.another_foo.another_bar": 1
}';
$decoded = json_decode($json, TRUE);
$new_json = "{";
$key = key($decoded);
$keys = explode('.', $key);
$final_value = $decoded[$key];
$len = count($keys);
foreach ($keys as $k => $v) {
if ($k == 0) {
$new_json .= "\"$v\"";
} else {
$new_json .= ":{\"$v\"";
}
if ($k == $len - 1) $new_json .= ":$final_value";
}
$new_json .= str_repeat("}", $len);
var_dump($new_json); // '{"foo":{"bar":{"another_foo":{"another_bar":1}}}}'
$new_arr = json_decode($new_json, true);
var_dump($new_arr);
// the output:
array (size=1)
'foo' =>
array (size=1)
'bar' =>
array (size=1)
'another_foo' =>
array (size=1)
'another_bar' => int 1