我的目标非常简单,我想解析JSON中的$GLOBALS
变量(以进行记录)。根据这个Stackoverflow帖子https://stackoverflow.com/a/23176085/1369579,我必须删除递归变量。
以下代码有效:
<?php
$global_array = $GLOBALS;
$index = array_search('GLOBALS',array_keys($global_array));
$json = json_encode(array_splice($global_array, $index, $index-1));
var_dump($json);
?>
它返回string(59) "{"GLOBALS":{"_GET":[],"_POST":[],"_COOKIE":[],"_FILES":[]}}"
(在http://sandbox.onlinephpfunctions.com中)
但是我必须使用中间变量来存储array_splice
结果。当我这样做时,我将无法工作:
<?php
$global_array = $GLOBALS;
$index = array_search('GLOBALS',array_keys($global_array));
$splice_result = array_splice($global_array, $index, $index-1);
var_dump(json_encode($splice_result));
?>
结果为bool(false)
,而json_last_error_msg()
返回Recursion detected
。
两个版本之间有什么区别?我真的不明白对我来说foo(bar())
与$bar = bar(); foo($bar)
完全相同……
答案 0 :(得分:0)
我只是了解我的问题,调用array_splice
删除了$GLOBALS
变量……但我仍然不明白为什么。
我试图将代码放入函数中,因为我认为我的问题是直接将代码放入全局范围:
<?php
function globalWithoutGlobals() {
$global_array = $GLOBALS;
$index = array_search('GLOBALS',array_keys($global_array));
array_splice($global_array, $index, 1);
return $global_array;
}
var_dump(json_encode(globalWithoutGlobals()));
var_dump(json_encode(globalWithoutGlobals()));
/* returns
# First call: success,
string(47) "{"_GET":[],"_POST":[],"_COOKIE":[],"_FILES":[]}"
# Second call : wtf ?!!
<br />
<b>Notice</b>: Undefined variable: GLOBALS in <b>[...][...]</b> on line <b>4</b><br />
*/
对我来说仍然很奇怪,应该更改$global_array
,而不是$GLOBALS
。为了测试这种行为,我在其他数组上做了同样的事情(也有递归):
<?php
// Looks like $GLOBALS (with recursive element)
$globals_array = ["foo" => "bar"];
$globals_array['GLOBALS'] = &$globals_array;
$copy = $globals_array;
$index = array_search('GLOBALS', array_keys($copy));
array_splice($copy, $index, 1);
var_dump($globals_array);
var_dump($copy);
/* return:
array(2) {
["foo"]=>
string(3) "bar"
["GLOBALS"]=>
&array(2) {
["foo"]=>
string(3) "bar"
["GLOBALS"]=>
*RECURSION*
}
}
array(1) {
["foo"]=>
string(3) "bar"
}
*/
它返回预期的输出,那么为什么行为与$GLOBALS
不同? ?
要解决我的问题,我改变了方法,停止使用array_splice
,而是只对foreach
上的$GLOBALS
进行了幼稚的实现,其工作原理与预期的一样:< / p>
<?php
function globalWithoutGlobals() {
$result = [];
foreach ($GLOBALS as $key => $value) {
if ($key !== 'GLOBALS') {
$result[$key] = $value;
}
}
return $result;
}
var_dump(json_encode(globalWithoutGlobals()));
var_dump(json_encode(globalWithoutGlobals()));
/* it returns:
string(47) "{"_GET":[],"_POST":[],"_COOKIE":[],"_FILES":[]}"
string(47) "{"_GET":[],"_POST":[],"_COOKIE":[],"_FILES":[]}"
*/
如果有人知道为什么上述两个我的第一个示例之间的行为不同。我很好奇?