Преобразование json в массив с помощью рекурсивного метода?

Я пытаюсь преобразовать строку json внутри массива в массив,

$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, тогда вам нужно выполнить собственную рекурсию. Попробуйте эту версию объективировать:

 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); } } 

Который отлично работает для меня на обоих ваших наборах данных образца.

Что касается вашего кода, кажется, вы допустили ошибку, заставив его зацикливаться навсегда (последняя часть рекурсивного раздела):

 is_array($value) ? self::json_to_array($array) : $value; 

Вы загружаете весь массив в рекурсивную функцию вместо значения, которое тестировалось как массив.

Изменение его на:

 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); } 

См. Рабочий пример .

Это можно сделать гораздо проще.

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