Как создать массив из вывода массива, напечатанного с помощью print_r?
У меня есть массив:
$a = array('foo' => 'fooMe');
и я:
print_r($a);
который печатает:
Array ( [foo] => printme )
Есть ли функция, поэтому при выполнении:
needed_function(' Array ( [foo] => printme )');
Я получу массив array('foo' => 'fooMe');
назад?
Ответы
Ответ 1
Я на самом деле написал функцию, которая анализирует "строковый массив" в реальном массиве. Очевидно, это несколько хакерское и еще много, но оно работает на моей тестовой площадке. Здесь ссылка на действующий прототип на http://codepad.org/idlXdij3.
Я отправлю также встроенный код для тех людей, которые не хотят нажимать на ссылку:
<?php
/**
* @author ninetwozero
*/
?>
<?php
//The array we begin with
$start_array = array('foo' => 'bar', 'bar' => 'foo', 'foobar' => 'barfoo');
//Convert the array to a string
$array_string = print_r($start_array, true);
//Get the new array
$end_array = text_to_array($array_string);
//Output the array!
print_r($end_array);
function text_to_array($str) {
//Initialize arrays
$keys = array();
$values = array();
$output = array();
//Is it an array?
if( substr($str, 0, 5) == 'Array' ) {
//Let parse it (hopefully it won't clash)
$array_contents = substr($str, 7, -2);
$array_contents = str_replace(array('[', ']', '=>'), array('#!#', '#?#', ''), $array_contents);
$array_fields = explode("#!#", $array_contents);
//For each array-field, we need to explode on the delimiters I've set and make it look funny.
for($i = 0; $i < count($array_fields); $i++ ) {
//First run is glitched, so let pass on that one.
if( $i != 0 ) {
$bits = explode('#?#', $array_fields[$i]);
if( $bits[0] != '' ) $output[$bits[0]] = $bits[1];
}
}
//Return the output.
return $output;
} else {
//Duh, not an array.
echo 'The given parameter is not an array.';
return null;
}
}
?>
Ответ 2
Если вы хотите сохранить массив как строку, используйте serialize
[docs] и unserialize
[docs].
Чтобы ответить на ваш вопрос: Нет, нет встроенной функции для синтаксического анализа вывода print_r
в массив.
Ответ 3
Нет. Но вы можете использовать как функции serialize
, так и json_*
.
$a = array('foo' => 'fooMe');
echo serialize($a);
$a = unserialize($input);
Или:
echo json_encode($a);
$a = json_decode($input, true);
Ответ 4
Для вывода массива с Subarrays решение, предоставляемое ninetwozero, не будет работать, вы можете попробовать использовать эту функцию, которая работает со сложными массивами:
<?php
$array_string = "
Array
(
[0] => Array
(
[0] => STATIONONE
[1] => 02/22/15 04:00:00 PM
[2] => SW
[3] => Array
(
[0] => 4.51
)
[4] => MPH
[5] => Array
(
[0] => 16.1
)
[6] => MPH
)
[1] => Array
(
[0] => STATIONONE
[1] => 02/22/15 05:00:00 PM
[2] => S
[3] => Array
(
[0] => 2.7
)
[4] => MPH
[5] => Array
(
[0] => 9.61
)
[6] => MPH
)
)
";
print_r(print_r_reverse(trim($array_string)));
function print_r_reverse(&$output)
{
$expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
$lines = explode("\n", $output);
$result = null;
$topArray = null;
$arrayStack = array();
$matches = null;
while (!empty($lines) && $result === null)
{
$line = array_shift($lines);
$trim = trim($line);
if ($trim == 'Array')
{
if ($expecting == 0)
{
$topArray = array();
$expecting = 1;
}
else
{
trigger_error("Unknown array.");
}
}
else if ($expecting == 1 && $trim == '(')
{
$expecting = 2;
}
else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
{
list ($fullMatch, $key, $element) = $matches;
if (trim($element) == 'Array')
{
$topArray[$key] = array();
$newTopArray =& $topArray[$key];
$arrayStack[] =& $topArray;
$topArray =& $newTopArray;
$expecting = 1;
}
else
{
$topArray[$key] = $element;
}
}
else if ($expecting == 2 && $trim == ')') // end current array
{
if (empty($arrayStack))
{
$result = $topArray;
}
else // pop into parent array
{
// safe array pop
$keys = array_keys($arrayStack);
$lastKey = array_pop($keys);
$temp =& $arrayStack[$lastKey];
unset($arrayStack[$lastKey]);
$topArray =& $temp;
}
}
// Added this to allow for multi line strings.
else if (!empty($trim) && $expecting == 2)
{
// Expecting close parent or element, but got just a string
$topArray[$key] .= "\n".$line;
}
else if (!empty($trim))
{
$result = $line;
}
}
$output = implode("\n", $lines);
return $result;
}
/**
* @param string $output : The output of a multiple print_r calls, separated by newlines
* @return mixed[] : parseable elements of $output
*/
function print_r_reverse_multiple($output)
{
$result = array();
while (($reverse = print_r_reverse($output)) !== NULL)
{
$result[] = $reverse;
}
return $result;
}
?>
Есть одна крошечная ошибка, если у вас есть пустое значение (пустая строка), она вставляется в значение раньше.
Ответ 5
вы не можете сделать это с помощью print_r
,
var_export
должно допускать нечто подобное, но не совсем то, что вы просили
http://php.net/manual/en/function.var-export.php
$val = var_export($a, true);
print_r($val);
eval('$func_val='.$val.';');
Ответ 6
Там онлайн-инструмент, который может помочь
http://www.printr-reverse.org/
Он выполняет достойную работу, но пропускает запятые после суб-массивов и, возможно, других мест, поэтому небольшое исправление вручную должно выполнять эту работу.