Повторно создать исходный массив PHP из вывода print_r

Предположим, у меня есть этот вывод из какого-то источника, где у меня нет доступа к исходному созданному PHP массиву:

Array ( [products] => Array ( [name] => Arduino Nano Version 3.0 mit ATMEGA328P [id] => 10005 ) [listings] => Array ( [category] => [title] => This is the first line This is the second line [subtitle] => This is the first subtitle This is the second subtitle [price] => 24.95 [quantity] => [stock] => [shipping_method] => Slow and cheap [condition] => New [defects] => ) [table_count] => 2 [tables] => Array ( [0] => products [1] => listings ) ) 

Теперь я хотел бы ввести эти данные и алгоритм воссоздать исходный массив, который он печатает, поэтому я могу использовать его для собственного приложения.

В настоящее время я думаю о операторах sub_str() и regex, которые sub_str() данные и размещают их соответствующим образом. Прежде чем я буду дальше, есть ли более простой способ, через уже написанный код или плагины php, которые делают это для меня уже там?

Solutions Collecting From Web of "Повторно создать исходный массив PHP из вывода print_r"

 function print_r_reverse($in) { $lines = explode("\n", trim($in)); if (trim($lines[0]) != 'Array') { // bottomed out to something that isn't an array return $in; } else { // this is an array, lets parse it if (preg_match("/(\s{5,})\(/", $lines[1], $match)) { // this is a tested array/recursive call to this function // take a set of spaces off the beginning $spaces = $match[1]; $spaces_length = strlen($spaces); $lines_total = count($lines); for ($i = 0; $i < $lines_total; $i++) { if (substr($lines[$i], 0, $spaces_length) == $spaces) { $lines[$i] = substr($lines[$i], $spaces_length); } } } array_shift($lines); // Array array_shift($lines); // ( array_pop($lines); // ) $in = implode("\n", $lines); // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one) preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); $pos = array(); $previous_key = ''; $in_length = strlen($in); // store the following in $pos: // array with key = key of the parsed array's item // value = array(start position in $in, $end position in $in) foreach ($matches as $match) { $key = $match[1][0]; $start = $match[0][1] + strlen($match[0][0]); $pos[$key] = array($start, $in_length); if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1; $previous_key = $key; } $ret = array(); foreach ($pos as $key => $where) { // recursively see if the parsed out value is an array too $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0])); } return $ret; } } 

не мой код, найденный здесь в комментариях: print_r 'Matt' является владельцем

Я также разработал решение для вашей проблемы, потому что это очень полезный инструмент для воссоздания проблем здесь в Stack Overflow. Мой источник находится здесь: https://github.com/etalon/aprp

Я сделал это немного по-другому: в вашей строке вам не нужны перерывы, поэтому я просматриваю символы. Одно disatvantage: Если в ваших значениях массива есть скобки или скобки, это не сработает.