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]);
}
}
}