从字符串

时间:2016-03-08 16:52:09

标签: php

假设,我有休息的json:

{
    "foo.bar": 1
}

我希望像这样保存:

$array["foo"]["bar"] = 1

但我也可以在字符串中包含2个以上的“参数”。例如:

{
    "foo.bar.another_foo.another_bar": 1
}

我希望以同样的方式保存。

$array["foo"]["bar"]["another_foo"]["another_bar"] = 1

如果我不知道我有多少参数,我怎么能这样做?

3 个答案:

答案 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)

json_decode

开头

然后构建一个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