Php 使用递归方法将json转换为数组?
我试图将数组中的json字符串转换为数组Php 使用递归方法将json转换为数组?,php,recursion,php-5.3,json,Php,Recursion,Php 5.3,Json,我试图将数组中的json字符串转换为数组 $config = array( "type" => '{"category":"admin","page":"page"}', "say" => "Hello", "php" => array( "say" => "no", "type" => '{"category":"admin","page":"page"}', "gra
$config = array(
"type" => '{"category":"admin","page":"page"}',
"say" => "Hello",
"php" => array(
"say" => "no",
"type" => '{"category":"admin","page":"page"}',
"gran" =>array(
"name" => "Hi"
)
)
);
我的工作代码
class objectify
{
public function json_to_array($array, $recursive = true)
{
# if $array is not an array, let's make it array with one value of former $array.
if (!is_array($array)) $array = array($array);
foreach($array as $key => $value)
{
if($recursive === false) $array[$key] = (!empty($value) && is_string($value) && json_decode($value) != NULL) ? json_decode($value, true): $value;
else $array[$key] = (!empty($value) && is_string($value) && json_decode($value) != NULL) ? json_decode($value, true): is_array($value) ? self::json_to_array($array) : $value;
}
return $array;
}
}
没有递归方法,它可以正常工作,但如果我想执行递归,它就会中断,正如您在上面的代码中看到的那样
$object = new objectify();
$config = $object->json_to_array($config);
print_r($config);
错误消息
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2048 bytes) in C:\wamp\www\test\2012\php\set_variable.php on line 79
我只想得到这个结果
Array
(
[type] => Array
(
[category] => admin
[page] => page
)
[say] => Hello
(
[say] => no
[type] => {"category":"admin","page":"page"}
[gran] => Array
(
[name] => Hi
)
)
)
编辑:
$config = 'type={"category":"admin","page":"page"}&text_editor={"name":"mce-basic"}&parent_id=self&subtitle=true&description=true&content_1=true&script_1=true&primary_image=true';
parse_str($config,$array);
print_r($array);
结果,
Array
(
[type] => {"category":"admin","page":"page"}
[text_editor] => {"name":"mce-basic"}
[parent_id] => self
[subtitle] => true
[description] => true
[content_1] => true
[script_1] => true
[primary_image] => true
)
快速解决方案:
$full_array = array_map('json_decode', $array);
如果并非所有参数都是JSON,并且希望使用实际数组而不是stdClass
对象,则可能需要执行以下操作:
function json_decode_array($input) {
$from_json = json_decode($input, true);
return $from_json ? $from_json : $input;
}
$full_array = array_map('json_decode_array', $array);
如果您在JSON之外有更多级别的嵌套数组,那么您必须自己进行递归。请尝试此版本的objectify:
class objectify
{
public function json_mapper($value, $recursive = true) {
if (!empty($value) && is_string($value) &&
$decoded = json_decode($value, true)) {
return $decoded;
} elseif (is_array($value) && $recursive) {
return array_map('objectify::json_mapper', $value);
} else {
return $value;
}
}
// currying, anyone?
public function json_mapper_norecurse($value) {
return objectify::json_mapper($value, false);
}
public function json_to_array($array, $recursive = true)
{
# if $array is not an array, let's make it array with one value of
# former $array.
if (!is_array($array)) {
$array = array($array);
}
return array_map(
$recursive ? 'objectify::json_mapper'
: 'objectify::json_mapper_norecurse', $array);
}
}
这对您的两组样本数据都适用。可以更轻松地完成
function objectify(& $v, $k) {
$v_decoded = json_decode($v, true);
if ($v_decoded) { $v = $v_decoded; }
}
array_walk_recursive($config, 'objectify');
print_r($config);
Array
(
[type] => Array
(
[category] => admin
[page] => page
)
[say] => Hello
[php] => Array
(
[say] => no
[type] => Array
(
[category] => admin
[page] => page
)
[gran] => Array
(
[name] => Hi
)
)
)
就您的代码而言,您似乎犯了一个错误,导致它永远循环(递归部分的最后一部分): 您将整个数组输入递归函数,而不是测试为数组的值 将其更改为:
is_array($value) ? self::json_to_array($value) : $value;
我们应该解决这个问题
编辑:似乎是嵌套的三元条件导致了问题,如果在第二个条件周围加上大括号,它会起作用:
else
{
$array[$key] = (!empty($value) && is_string($value) && json_decode($value) != NULL)
? json_decode($value, true)
: (is_array($value) ? self::json_to_array($value) : $value);
}
.也许您可以使用简易功能:
$array=json\u decode(json\u encode($object),true);
可在此处找到:
setTimeout(函数(){alert(“JavaScript”);},1000);
如果您使用的是laravel框架,并且post参数包含数组,请在数组映射中使用json_decode对递归值进行解码
$params = array_map('json_decode', $request->all());
我想问一下,为什么您的数据结构中有部分(并且只有部分)经过解析的JSON?首先,您是如何获得JSON字符串数组的?看起来这些应该是一个JSON数组,你可以一次全部解码。你需要帮助解决内存问题吗?@MarkReed-请参阅我上面的编辑。好的。。。仍然不知道为什么要用JSON值传递查询参数,而不是将JSON文档放在请求体中;json_解码已经是递归的。所以,一旦你找到JSON,你就很好了。@Porridge-谢谢,它工作得很好。但是如何应用
array\u walk\u recursive($config,'objectify')代码>在一个类中,例如我的OP中的一个?谢谢,但仍然是相同的错误致命错误:允许的内存大小为134217728字节(试图分配523800字节),在C:\wamp\www\test\2012\php\set\u variable.php的第79行
使用php的内置函数,而不是您自己的递归,它们的性能要好得多。@lauthiamkok我找不到源代码,但我在某处读到嵌套的三元运算符可能会导致意外的结果。如果你在最后一节(我发布的那一节)周围放上括号,它会改变什么吗?我不认为鼓励对解决方案采取糟糕/误导的方法是有帮助的。@lauthiamkok似乎嵌套三元是问题所在,请参阅我的编辑。这些不起作用,Mark,我只是两者都运行了。JSON字符串值将转换为空字符串.Hm。我的结果缺少非JSON值(在上面的编辑中修复),但在其他方面看起来是正确的。有什么不同?看起来不错,不知道json_解码是递归的:)Def。更好的解决方案op.@MarkReed-谢谢,它工作得很好,但仍然会与数组(如我的op中的数组)断开。我收到此错误警告:json_decode()希望参数1是字符串,数组在C:\wamp\www\test\…
@MarkReed-谢谢您的编辑。我很抱歉地告诉您,我得到了这个错误致命错误:调用C:\wamp\www\.中未定义的函数json_mapper()。。第109行
引用了返回json\u映射器($value,false)代码>。但是我得到了我想要的结果。。。
$params = array_map('json_decode', $request->all());