2016-03-08 63 views
-1

想,我有休耕JSON:從字符串創建密鑰鏈

{ 
    "foo.bar": 1 
} 

,我想挽救這個是這樣的:

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

,但我也可以有超過2「參數「在字符串中。例如:

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

我想以同樣的方式保存。

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

任何想法如果我不知道有多少個參數,我該怎麼辦?

回答

1

這是遠遠不是最好的解決方案,但我一直在編程,所以我有點累,但我希望它給你一些工作,或至少一個工作的解決方案暫時。

下面是它的工作的IDEone: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字符串是否可能有數倍或不所以我讓它處理了前者。

希望它有幫助,未來可能會回來並清理它。

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是通過引用遞歸函數傳遞的。這個非常重要。

0

嘗試下面的技巧爲「重新格式化」到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