json_encode不适用于array_splice返回,但如果直接调用则有效

时间:2019-08-28 16:51:52

标签: php arrays

我的目标非常简单,我想解析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)完全相同……

1 个答案:

答案 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":[]}"
*/

如果有人知道为什么上述两个我的第一个示例之间的行为不同。我很好奇?