У меня есть объект в этом формате, который может быть бесконечно глубоким.
stdClass Object
(
[condition] => AND
[rules] => Array
(
[0] => stdClass Object
(
[id] => app
[field] => app
[type] => string
[operator] => equal
[value] => files_sharing
)
[1] => stdClass Object
(
[id] => deviceType
[field] => deviceType
[type] => string
[input] => select
[operator] => equal
[value] => android
)
[2] => stdClass Object
(
[id] => userGroup
[field] => userGroup
[type] => string
[operator] => equal
[value] => admin
)
[3] => stdClass Object
(
[condition] => AND
[rules] => Array
(
[0] => stdClass Object
(
[id] => userGroup
[field] => userGroup
[type] => string
[operator] => equal
[value] => group
)
[1] => stdClass Object
(
[id] => time
[field] => time
[type] => time
[input] => text
[operator] => between
[value] => Array
(
[0] => 12:30 am -0500
[1] => 06:00 am -0500
)
)
[2] => stdClass Object
(
[id] => request
[field] => request
[type] => string
[input] => select
[operator] => equal
[value] => post
)
)
)
)
)
Формат, в который он пытается попасть, - это
array(
0 => array(
'condition' => 'and',
'rules' => array({RULESHERE})
),
1 => array(
'condition' => 'and',
'rules' => array({RULES HERE})
),
);
То, что у меня есть на данный момент, но это неудачный хардкор.
Public function loop(obj) {
// First we get the condition
$this->stack[$this->stackCounter]['condition'] = $obj->condition;
$this->stack[$this->stackCounter]['rules'] = array();
foreach ($obj as $rule) {
if (isset($rule->condition)) {
$this->loop($rule);
} else {
array_push($this->stack[$this->stackCounter]['rules'], $rule);
// $this->evalCondition($rule);
}
}
$this->stackCounter++;
}
}
Может кто-то, пожалуйста, протянуть идиот руку.
Пытаться
foreach ($obj->rules as $rule) {
Счетчик стека должен быть передан как параметр, чтобы сделать его локальным. В противном случае счетчик стека изменится глобально, как только вы войдете в петлю ветки и вернетесь, чтобы повторить следующие правила. Таким образом, код выглядит следующим образом:
public function loop($obj, $stackCounter)
{
$this->stack[$stackCounter]['condition'] = $obj->condition;
$this->stack[$stackCounter]['rules'] = array();
foreach ($obj->rules as $rule) {
if (isset($rule->condition)) {
$this->loop($rule, $stackCounter + 1);
} else {
array_push($this->stack[$stackCounter]['rules'], $rule);
}
}
}