Рекурсивно отформатировать объект

0

У меня есть объект в этом формате, который может быть бесконечно глубоким.

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++;
        }
}

Может кто-то, пожалуйста, протянуть идиот руку.

Теги:
recursion

1 ответ

2
Лучший ответ

Пытаться

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);
        }
    }
}
  • 0
    Знал, что это было что-то глупое, что работает для вложенных правил, но не для первого набора правил и условий ...
  • 0
    Не могли бы вы обновить ваш предполагаемый вывод, чтобы включить 4-й элемент, где у вас есть вложенное условие?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню