我有一个数组:
$a = array('foo' => 'fooMe');
我做的事情包括:
print_r($a);
打印出如下内容:
Array ( [foo] => printme )
有没有一个函数,可以在执行以下操作时:
needed_function(' Array ( [foo] => printme )');
我会得到数组 array('foo' => 'fooMe');
吗?
我有一个数组:
$a = array('foo' => 'fooMe');
我做的事情包括:
print_r($a);
打印出如下内容:
Array ( [foo] => printme )
有没有一个函数,可以在执行以下操作时:
needed_function(' Array ( [foo] => printme )');
我会得到数组 array('foo' => 'fooMe');
吗?
我实际上编写了一个函数,将“字符串数组”解析为实际的数组。显然,它有些麻烦并且不太好看,但是它可以在我的测试用例中正常工作。这里有一个链接到可行原型的链接: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's 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's 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;
}
}
?>
serialize
/unserialize
和json_encode()
/json_decode()
。) - mickmackusaserialize
和json_*
函数。$a = array('foo' => 'fooMe');
echo serialize($a);
$a = unserialize($input);
或者:
echo json_encode($a);
$a = json_decode($input, true);
print_r()
输出的文本,需要对这个文本进行解析。 - mickmackusa使用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.';');
needed_function(' Array ( [foo] => printme )');
- ajrealeval
! - vzwickprint_r()
生成的文本--这正是OP所需要的。 - mickmackusa有一个很好的在线工具,它正是其名称所描述的:
从 JSON 对象到数组,只需要使用 json_decode 函数即可:
如果想要得到一个数组,可以将第二个参数设置为 true。否则,你将得到一个对象。
json_decode($jsondata, true);
我认为我的函数也很酷,可以处理嵌套的数组:
function print_r_reverse($input)
{
$output = str_replace(['[', ']'], ["'", "'"], $input);
$output = preg_replace('/=> (?!Array)(.*)$/m', "=> '$1',", $output);
$output = preg_replace('/^\s+\)$/m', "),\n", $output);
$output = rtrim($output, "\n,");
return eval("return $output;");
}
NB: 最好不要在用户输入数据中使用此功能
Array
(
)
一个简单的搜索和替换就可以解决这个限制。 - TuarisstdClass Object
、数字数据类型、多行字符串值和转义引号。 - trincotprint_r
输出解析器,可以产生与PHP语法相同的表达式。它是作为交互式Stack Snippet编写的,所以您可以在此处使用它:
function parse(s) {
const quote = s => '"' + s.replace(/["\\]/g, '\\$&') + '"';
const compress = indent => " ".repeat(((indent.length + 4) >> 3) * 4);
return "$data = " + (s.replace(/\r\n?/g, "\n") + "\n").replace(
/(Array|\w+ (Object)) *\n *\( *\n|^( *)(?:\[(?:(0|-?[1-9]\d*)|(.*?))\] => |(\) *\n+))|(-?\d+(?:\.\d+)?(?:E[-+]\d+)?)\n|(.*(?:\n(?! *\) *$| *\[.*?\] => ).*)*)\n/gm,
(_, array, object, indent, index, key, close, number, string) =>
object ? "(object) [\n"
: array ? "[\n"
: close ? compress(indent) + "],\n"
: indent ? compress(indent) + (index ?? quote(key)) + " => "
: (number ?? quote(string)) + ",\n"
).replace(/,\n$/, ";");
}
// I/O handling
const [input, output] = document.querySelectorAll("textarea");
(input.oninput = () => output.value = parse(input.value))();
textarea { width: 23em; height: 12em }
<table><tr><th>Input print_r format</th><th>Output PHP syntax</th></tr>
<tr><td><textarea>
Array
(
[0] => example
[1] => stdClass Object
(
[a[] => 1.43E+19
["] => quote
[] =>
)
)
</textarea></td><td><textarea readonly></textarea></td></tr></table>
print_r
输出中删除任何换行符。例如,Array
之后的开括号和闭括号必须分别出现在不同的行上。=>
周围的间距(前后各一个空格)。print_r
不能区分null
、""
或false
(这些值不会产生输出),也不能区分true
和1
(两者都会输出为1
),因此该转换器永远不会产生null
、false
或true
。print_r
不能区分数字和字符串(9
可以表示数字或字符串),所以当存在这种歧义时,该转换器将假定数据类型是数值型。stdClass Object
得到支持,并翻译为(object) [...]
表示法MyClass Object
将被视为stdClass
对象。function parsePrintedArray($s){
$lines = explode("\n",$s);
$a = array();
foreach ($lines as $line){
if (strpos($line,"=>") === false)
continue;
$parts = explode('=>',$line);
$a[trim($parts[0],'[] ')] = trim($parts[1]);
}
return $a;
}
适用于对象和数组:
$foo = array (
'foo' => 'bar',
'cat' => 'dog'
);
$s = print_r($foo,1);
$a = parsePrintedArray($s);
print_r($a);
输出:
Array
(
[foo] => bar
[cat] => dog
)
不支持嵌套数组,但简单快速。
stdClass Object
(它返回一个数组而不是对象),数字数据类型,多行字符串值,以及以空格开头/结尾的字符串。 - trincot快速函数(不检查您是否发送了正确的数据):
function textToArray($str)
{
$output = [];
foreach (explode("\n", $str) as $line) {
if (trim($line) == "Array" or trim($line) == "(" or trim($line) == ")") {
continue;
}
preg_match("/\[(.*)\]\ \=\>\ (.*)$/i", $line, $match);
$output[$match[1]] = $match[2];
}
return $output;
}
这是预期的输入:
Array
(
[test] => 6
)
使用
var_export(array('Sample array', array('Apple', 'Orange')));
输出:
array (
0 => 'Sample array',
1 =>
array (
0 => 'Apple',
1 => 'Orange',
),
)
print_r()
生成的文本。 - mickmackusa
Array()
时需要递归调用),也不涉及特殊情况。无论如何,print_r()的结果是不确定的,因为键/值可能包含print_r使用的分隔符或\n
,而且没有任何转义... - Déjà vu