繁体   English   中英

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

[英]json_encode doesn't works on array_splice return but works if called directly

我的目标非常简单,我想解析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)是完全相同的代码$bar = bar(); foo($bar) $bar = bar(); foo($bar)

我只是了解我的问题,调用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 ,而是只对$GLOBALS进行了一个foreach的幼稚实现,它的工作方式与预期的一样:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM