1
我有以下数据:遍历所有对象,直到父插入,然后插入自
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,字段是main field
/main question
。如果它是1,那么它是一个sub-field
/sub-question
。
我需要遍历它并构建字段的层次结构。
所以我试图得到它的循环是这样的:
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_field_id
可能不存在/插入的是,这样的话它会忽略它并继续下一步。如果是这样,是否有办法让foreach
保持循环(或者可以使用while
)继续浏览项目,直到全部插入为止?