Php 循环遍历所有对象,直到插入父对象,然后插入自对象

Php 循环遍历所有对象,直到插入父对象,然后插入自对象,php,Php,我有以下数据: Array ( [form_field_id] => CbIXvKxy2camTsM [form_id] => IHwNBRTV4QcSu0Z [field_id] => 0GW8GjlF7qufIJn [parent_field_id] => xu7SJU9aUGu52FD [list_type_id] => [is_child] => 1 [state] => 1 [a

我有以下数据:

Array
(
    [form_field_id] => CbIXvKxy2camTsM
    [form_id] => IHwNBRTV4QcSu0Z
    [field_id] => 0GW8GjlF7qufIJn
    [parent_field_id] => xu7SJU9aUGu52FD
    [list_type_id] => 
    [is_child] => 1
    [state] => 1
    [active] => 1
    [created_at] => 2016-02-12 22:24:28
    [updated_at] => 2016-02-12 22:24:28
    [field_type_id] => 
    [position_in_form] => 0
    [required] => 0
    [multiple_select] => 0
    [item_language_id] => vb8EYue2gwTLmUV
    [item_id] => 0GW8GjlF7qufIJn
    [language_id] => i4yZDXRuljgoUEU
    [item_language_type_id] => TLajukarXC1YZhq
    [item_name] => 
    [item_description] => 
    [item_help] => 
    [item_placeholder] => 
    [item_extra_info] => 
)
Array
(
    [form_field_id] => l28it3KmuLT9LdI
    [form_id] => IHwNBRTV4QcSu0Z
    [field_id] => S8xouMqf16S6FvJ
    [parent_field_id] => xu7SJU9aUGu52FD
    [list_type_id] => 
    [is_child] => 1
    [state] => 1
    [active] => 1
    [created_at] => 2016-02-12 22:24:28
    [updated_at] => 2016-02-12 22:24:28
    [field_type_id] => 
    [position_in_form] => 0
    [required] => 0
    [multiple_select] => 0
    [item_language_id] => EHh7WCgd92GjGYx
    [item_id] => S8xouMqf16S6FvJ
    [language_id] => i4yZDXRuljgoUEU
    [item_language_type_id] => TLajukarXC1YZhq
    [item_name] => 
    [item_description] => 
    [item_help] => 
    [item_placeholder] => 
    [item_extra_info] => 
)
Array
(
    [form_field_id] => maDMHwyOCBQBYDP
    [form_id] => IHwNBRTV4QcSu0Z
    [field_id] => xu7SJU9aUGu52FD
    [parent_field_id] => s8RX7J79v0K4rKq
    [list_type_id] => 
    [is_child] => 1
    [state] => 1
    [active] => 1
    [created_at] => 2016-02-12 22:24:28
    [updated_at] => 2016-02-12 22:24:28
    [field_type_id] => 
    [position_in_form] => 0
    [required] => 0
    [multiple_select] => 0
    [item_language_id] => l6FurGRaO0xKIe0
    [item_id] => xu7SJU9aUGu52FD
    [language_id] => i4yZDXRuljgoUEU
    [item_language_type_id] => TLajukarXC1YZhq
    [item_name] => 
    [item_description] => 
    [item_help] => 
    [item_placeholder] => 
    [item_extra_info] => 
)
Array
(
    [form_field_id] => oEcBTJ0EeLs8Lqd
    [form_id] => IHwNBRTV4QcSu0Z
    [field_id] => DQnb5frKCbtpD6l
    [parent_field_id] => -1
    [list_type_id] => 
    [is_child] => 0
    [state] => 1
    [active] => 1
    [created_at] => 2016-02-12 22:24:28
    [updated_at] => 2016-02-12 22:24:28
    [field_type_id] => 
    [position_in_form] => 0
    [required] => 0
    [multiple_select] => 0
    [item_language_id] => 9Ggrn5w8Vyox8i6
    [item_id] => DQnb5frKCbtpD6l
    [language_id] => i4yZDXRuljgoUEU
    [item_language_type_id] => TLajukarXC1YZhq
    [item_name] => 
    [item_description] => 
    [item_help] => 
    [item_placeholder] => 
    [item_extra_info] => 
)
Array
(
    [form_field_id] => Os7ltKzO4qJDQUB
    [form_id] => IHwNBRTV4QcSu0Z
    [field_id] => s8RX7J79v0K4rKq
    [parent_field_id] => DQnb5frKCbtpD6l
    [list_type_id] => 
    [is_child] => 1
    [state] => 1
    [active] => 1
    [created_at] => 2016-02-12 22:24:28
    [updated_at] => 2016-02-12 22:24:28
    [field_type_id] => 
    [position_in_form] => 0
    [required] => 0
    [multiple_select] => 0
    [item_language_id] => qz82stTcc4g92Ya
    [item_id] => s8RX7J79v0K4rKq
    [language_id] => i4yZDXRuljgoUEU
    [item_language_type_id] => TLajukarXC1YZhq
    [item_name] => 
    [item_description] => 
    [item_help] => 
    [item_placeholder] => 
    [item_extra_info] => 
)
我正在构建一个表单生成器,数据已经保存到数据库中,但尝试提取它现在是一项任务。每个数组表示一个字段

如您所见,有一个
is_child
字段,如果它为0,则该字段是
主字段
/
主问题
。如果是1,则它是一个子字段/
子问题

我需要遍历它并构建字段的层次结构

所以我试着让它像这样循环:

DQnb5frKCbtpD6l : {
    s8RX7J79v0K4rKq : {
        xu7SJU9aUGu52FD : {
            0GW8GjlF7qufIJn : {}
        }
    }
},
...
每个级别可以有多个项目,因此这是有效的:

DQnb5frKCbtpD6l : {
    s8RX7J79v0K4rKq : {
        xu7SJU9aUGu52FD : {
            0GW8GjlF7qufIJn : {},
            a : {}
        },
        b : {}
    },
    c : {}
},
...
最有效的方法是什么?我目前正在尝试:

foreach ($fields as $field) {
    // $field is an object, I printed out $field->toArray() to get the data above
    $this->loopThrough($field, $form_structure);
}

private function loopThrough($field, &$form_structure) {

    // check if is parent
    if($field->is_child == 0) {
        $form_structure[$field->field_id] = [];
        return true;
    }

    // check if is child of current level
    if(array_key_exists($field->parent_field_id, $form_structure)) {
        $form_structure[$field->parent_field_id][$field->field_id] = [];
        return true;
    }

    // check if is grandchild
    foreach($form_structure as $key => $value) {
        if($key == $field->parent_id || array_key_exists($field->parent_id, $value)) {
            $value[] = $field->field_id;
        } else {
            $this->loopThrough($field, $value);
        }
    }
}
我认为正在发生的事情:


在对象中循环时,当我检查ID时,
parent\u field\u ID
可能尚未出现/插入,因此它将忽略它并继续下一步。如果是这样的话,有没有办法让
foreach
保持循环(或者使用
while
)继续遍历项目直到全部插入?

最终成功地完成了。代码如下:

    foreach($form_fields as $form_item) {
        $all_form_fields[$form_item->field_id] = $form_item;
    }

    foreach($form_fields_parents as $form_item) {
        $form_structure[$form_item->field_id] = [];
    }

    $this->insertChildren($all_form_fields, $form_structure);

function insertChildren($fields, &$form_structure) {
    foreach($form_structure as $key => $value) {
        if(array_key_exists($key, $fields)) {
            foreach($fields as $field) {
                if($field->parent_field_id == $key) {
                    $form_structure[$key][$field->field_id] = [];
                }
            }
        }
        if(count($form_structure[$key]) > 0) {
            $this->insertChildren($fields, $form_structure[$key]);
        }
    }
}

终于成功了。代码如下:

    foreach($form_fields as $form_item) {
        $all_form_fields[$form_item->field_id] = $form_item;
    }

    foreach($form_fields_parents as $form_item) {
        $form_structure[$form_item->field_id] = [];
    }

    $this->insertChildren($all_form_fields, $form_structure);

function insertChildren($fields, &$form_structure) {
    foreach($form_structure as $key => $value) {
        if(array_key_exists($key, $fields)) {
            foreach($fields as $field) {
                if($field->parent_field_id == $key) {
                    $form_structure[$key][$field->field_id] = [];
                }
            }
        }
        if(count($form_structure[$key]) > 0) {
            $this->insertChildren($fields, $form_structure[$key]);
        }
    }
}