Мне нужно создать сложный многоуровневый массив только в обратном вызове, одно атомарное обновление за вызов.
Причина этого: обратный вызов много раз вызывается из итеративного парсера.Наконец, он должен создать десериализованный 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']));
Попробуйте здесь
Вышепример печатает:
[1,2,[10,11]]
, но должен [1,2,[10,11],3,4]
.
Обновление: Многоуровневый означает произвольные массивы произвольной глубины.
Обновление: Проблема была с array_pop()
, см. Ниже принятый ответ для фиксированной версии.