【发布时间】:2018-09-28 00:12:16
【问题描述】:
我只需要在回调中构建复杂的多级数组,每次调用一次原子更新。
原因:迭代解析器多次调用回调。最后它应该构建被解析的二进制格式的反序列化 PHP 数组。
这是可运行的代码:
const ACTION_VALUE = 1;
const ACTION_ENTER = 2;
const ACTION_LEAVE = 3;
function callback($action, $value, &$param)
{
switch ($action)
{
case ACTION_ENTER:
$param['parent'][] = &$param['current'];
$param['current'][] = [];
end($param['current']);
$param['current'] = &$param['current'][key($param['current'])];
break;
case ACTION_LEAVE:
unset($param['current']);
$param['current'] = array_pop($param['parent']);
end($param['current']);
break;
case ACTION_VALUE:
$param['current'][] = $value;
break;
}
}
// prepare container
$arr = [];
$arr['data'] = [];
$arr['current'] = &$arr['data'];
$arr['parent'] = [];
// callback invocations
callback(ACTION_VALUE, 1, $arr);
callback(ACTION_VALUE, 2, $arr);
callback(ACTION_ENTER, 0, $arr);
callback(ACTION_VALUE, 10, $arr);
callback(ACTION_VALUE, 11, $arr);
callback(ACTION_LEAVE, 0, $arr);
callback(ACTION_VALUE, 3, $arr);
callback(ACTION_VALUE, 4, $arr);
// now see result
var_dump(json_encode($arr['data']));
试试here
以上示例打印:
[1,2,[10,11]],但应该
[1,2,[10,11],3,4].
更新: 多级表示随机深度的任意数组。
更新:
问题出在array_pop(),请参阅下面接受的固定版本答案。
【问题讨论】:
-
您可以尝试作为指针进入和离开吗?离开时,将其添加到数据中,然后将指针指向主数据?
-
如果您的意思是,将不同的“上下文”传递给回调?不,我不能,因为解析器调用了回调,并且解析器对回调的使用方式一无所知......它只是通过 &$param 进行所有回调调用,对 &$param 是什么一无所知。
标签: php pass-by-reference recursive-datastructures