2016-02-13 101 views
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)继续浏览项目,直到全部插入为止?

回答

0

管理终于做到了。这里是代码:

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