Organizational Research By

Surprising Reserch Topic

recreate original php array from print r output using -'php,arrays,multidimensional-array,output'

recreate original php array from print r output  using -'php,arrays,multidimensional-array,output'

Let's say I have this output from some source where I don't have access to the original PHP created 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


Now I would like to input that data and have an algorithm recreate the original array that it was printing so I can then use it for my own application.

Currently I am thinking about a sub_str() and regex statements that pull data and place it appropriately. Before I head further, is there a simpler way, via already written code or php plugins that do this for me already out there?

asked Sep 8, 2015 by rajesh
0 votes

Related Hot Questions

2 Answers

0 votes
this works tasty: thank you Jonathan Kuhn 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; } } not my code, found here in the comments: print_r 'Matt' is the owner
answered Sep 8, 2015 by rajesh
0 votes
I also worked out a solution for your problem because it is a very useful tool to recreate issues here on stackoverflow. My source is located here: I did it a bit different: In your string you don't need line-breaks, so I walk through the chars. One disatvantage: If there are brackets or paranthesises in your array-values it won't work.
answered Sep 8, 2015 by rajesh