大佬教程收集整理的这篇文章主要介绍了php-如何删除对象或数组内的递归?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个例子数组.
$data = new stdClass();
$data->foo = [
'foo1' => &$data,
'foo2' => 23,
];
$data->bar = new stdClass();
$data->nar->object = [
'bar1' => &$data->bar,
'bar2' => 43,
];
我想解析为:
$data = new stdClass();
$data->foo = [
'foo1' => "REcursION DETECTED",
'foo2' => 23,
];
$data->bar = new stdClass();
$data->nar->object = [
'bar1' => "REcursION DETECTED",
'bar2' => 43,
];
我需要它,因为json_encode在检测到递归时无法对数据进行编码.
我尝试了很多次,并且以不同的方式进行了很多研究,但是没有发现任何真正对我有帮助的东西.
我最后的尝试是:
function _stack(&$object, &$stack = [], $key = 'original')
{
if (isObjectOrArray($object)) {
if (!in_array($object, $stack, truE)) {
if (is_object($object)) {
$stack[$key] = &$object;
}
foreach ($object as $key => &$value) {
_stack($value, $stack, $key);
}
}
}
return $stack;
}
function _remove($object, $stack, $objectO = false, $key = 'original')
{
/**
* @var $objectO false | object
*/
if (!$objectO) {
$objectO = $object;
}
if (isObjectOrArray($object)) {
foreach ($object as $prop => $value) {
if (is_object($objectO)) {
if (in_array($object->{$prop}, $stack, truE) && $prop !== $key) {
$objectO->{$prop} = "REcursION DETECTED";
} else {
$objectO->{$prop} = _remove($object->{$prop}, $stack, $objectO->{$prop}, $prop);
}
} else {
if (in_array($object[$prop], $stack, truE) && $prop !== $key) {
$objectO[$prop] = "REcursION DETECTED";
} else {
$objectO[$prop] = _remove($object[$prop], $stack, $objectO[$prop], $prop);
}
}
}
}
return $objectO;
}
首先,我用原始对象(而不是引用/指针)创建一个堆栈.
密钥是在递归中传递给函数的,因此我确切地知道递归与原始对象的位置.我需要它,因此我可以告诉指针是什么以及原始对象是什么.
创建堆栈后,我运行相同的循环,但是foreach语句中的当前值是一个对象,并且他在堆栈中,并且当前键与当前键传递给函数调用的当前键不同,引用/指针被破坏.
Array
(
[foo1] => REcursION DETECTED
[foo2] => 23
)
REcursION DETECTED
解决方法:
我仍然在寻找另一种方式,因为这很有趣,但是很容易将序列化字符串中的引用指针替换为非序列化字符串:
$data = unserialize(preg_replace('/R:\d+/', 's:18:"REcursION DETECTED"', serialize($data)));
PHP> = 7.3.0的另一个选项是导出并强制其破坏引用. var_export将抱怨递归,但是它会高兴地显示它,并用NULL替换引用. var_export有第二个参数返回输出而不是显示输出,但这不适用于递归,因此我缓冲并捕获了输出.
ob_start();
@var_export($data);
$var = ob_get_clean();
eval("\$data = $var;");
对于PHP< 7.3.0您可以将上述代码与实现__set_state而不是stdClass的类一起使用:
class myClass {
public static function __set_state($array) {
$o = new self;
foreach($array as $key => $val) {
$o->$key = $val;
}
return $o;
}
}
$data = new myClass();
以上是大佬教程为你收集整理的php-如何删除对象或数组内的递归?全部内容,希望文章能够帮你解决php-如何删除对象或数组内的递归?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。