Php 如何对$GLOBALS进行json_编码?

Php 如何对$GLOBALS进行json_编码?,php,json,globals,Php,Json,Globals,我正在尝试调试一个PHP应用程序,作为调试过程的一部分,我将print_r($GLOBALS)通过AJAX请求传递给我的浏览器。然而,我更喜欢以原生JSON形式查看它,因为它在浏览器中表现得更好。我尝试使用以下代码片段: json_encode($GLOBALS); 但我发现它返回bool(false)。上面说“成功时返回一个JSON编码的字符串,失败时返回FALSE。”但是$GLOBALS会使它失败吗?是递归的$GLOBALS['GLOBALS']吗 我想作为循环$GLOBALS并将其放入数

我正在尝试调试一个PHP应用程序,作为调试过程的一部分,我将print_r($GLOBALS)通过AJAX请求传递给我的浏览器。然而,我更喜欢以原生JSON形式查看它,因为它在浏览器中表现得更好。我尝试使用以下代码片段:

json_encode($GLOBALS);
但我发现它返回bool(false)。上面说“成功时返回一个JSON编码的字符串,失败时返回FALSE。”但是$GLOBALS会使它失败吗?是递归的$GLOBALS['GLOBALS']吗


我想作为循环$GLOBALS并将其放入数组的替代方案,但当json_encode的目的是对数组进行编码时,这似乎毫无意义。

在我自己进行测试时,json_encode()似乎无法处理递归,例如$GLOBALS['GLOBALS']中提供的递归。。。等等

所以你可以做的一个技巧是:

json_encode(array_slice($GLOBALS, 1));
它将跳过$GLOBALS['GLOBALS'],并继续对数组的其余部分进行编码


*编辑:$GLOBALS['GLOBALS']在打印此数组时首先出现,但更好的方法是找到$GLOBALS['GLOBALS']出现的位置并完全跳过该元素。

我提出了一种全局位置不重要的方法:

json_encode(array_intersect_key($GLOBALS,array_flip(array("_GET", "_POST", "_FILES", "_COOKIE"))));
或者更好的方法:

$new_array = $GLOBALS;
$index = array_search('GLOBALS',array_keys($new_array));
json_encode(array_splice($new_array, $index, $index-1));

$GLOBALS
包含对自身的引用这一事实导致了一个无限递归,
json_encode
无法处理,因为它超过了,因此默认情况下将返回
false

解决方案是在不进行自引用的情况下创建
$GLOBALS
的副本,下面的函数仅引用
\u GET\u POST\u SERVER..
,前提是在变量命名约定中不使用
$\ucode>:

function getEncodableGlobals()
{
    $g = [];

    foreach ($GLOBALS as $key => &$val)
    {
        if ($key[0] == '_')
        {
            $g[$key] = &$val;
        }
    }

    return $g;
}
请注意,
$g
不保存副本,只保存对变量的引用,就像
$GLOBALS
一样。如果希望在全局范围中包含所有变量,只需更改条件以排除麻烦的引用:

...
    if ($key !== 'GLOBALS')
...
现在您可以安全地对其进行编码:

json_encode(
    getEncodableGlobals()
);

您也可以通过
array\u filter
的方式来完成,并复制变量

$encodableGlobals = array_filter($GLOBALS, function($key) {
    return $key !== 'GLOBALS';
}, ARRAY_FILTER_USE_KEY);

int(6)-消息为“检测到递归”。我想你刚把array_slice()的数字搞错了,你从一开始就把一个切分了。你刚刚错过了一个参数,它应该是json_encode(array_slice($GLOBALS,0,-1))@iggyvolz我的目标是跳过第一个元素$GLOBALS['GLOBALS'],因此我创建了偏移量参数1(这是PHP文档中的第二个参数),并在数组的其余部分继续。但如果它对你有用的话,那我就没什么好抱怨的了;未设置($globals_dump['globals']);//您可能还必须取消设置($globals_dump['globals_dump']);取决于您是否处于function@iggyvolz啊,我想这对我们两个都没有帮助P无论如何,如果您需要一个故障保护版本(假设您直接使用$GLOBALS),有几种方法可以忽略该特定元素。这难道不要求您硬编码所需的$GLOBALS中的所有元素吗?全局变量呢?是的。我现在只需键入您要删除的索引即可。概念是一样的,但我更喜欢第二个代码段的实现+1.