2013-12-15 7 views
0

Нужно руководствоваться некоторой рекурсией PHP, я просматриваю некоторые данные, сравнивая их с Картой, и если форма (в данных) имеет подчиненную форму, она должна быть добавлена ​​к БД с идентификатором родителей.Рекурсия PHP не возвращается к циклу foreach

Все, кажется, работает, за исключением того, что подформа представляет собой массив, поскольку могут быть несколько подчиненных форм того же типа.

Heres краткая структура:

Parent[0] 

SF_1[0] 

    _SF_2[0] 
    _SF_2[1] 
    _SF_2[n] 

SF_1[1] 

SF_2[0] 

SF_n[0] 

Так что я добавить родитель в отдельной функции, а затем запустить подчиненную рекурсию (этот бит отлично работает):

private function add_form_records($_data, $map) 
{ 
    $form = new FormItem(); 

    foreach($map["fields"] as $item) { 
     $key = $item->field; 
     if(array_key_exists($key, $_data)) 
     { 
      $form->column_data->$key = $_data[$key]; 
     } 
    } 

    $form->list_name = $map["sp_list"]; 
    $form->form_id = $this->id_count; 
    $form->__metadata->type = $this->get_list_id($form->list_name); 
    //Add the form to SP and get the ID back for the subforms 
    $id = $this->add_record($form); 

    foreach($map["subforms"] as $key=>$value) { 
     $this->add_subform_records($_data[$key], $value, $form->form_id); 
    } 
} 

Тогда Heres функция, вызывается для добавления подформ, а затем вызывает сам по себе подформу:

private function add_subform_records($_data, $_map, $_parent_id) 
{ 
    for ($i = 0; $i < count($_data); ++$i) { 
      $form = new FormItem(); 

      foreach($_map["fields"] as $fieldItem) 
      { 
       $key = $fieldItem->field; 

       if(array_key_exists($key, $_data[$i])) 
       { 
        $form->column_data->$key = $_data[$i][$key]; 
       } 
      } 

      $form->parent_id = $_parent_id; 
      $form->list_name = $_map["sp_list"]; 
      $form->form_id = $this->id_count; 
      $form->form_name = $_map["subform_name"]; 

      $form->__metadata->type = $this->get_list_id($form->list_name); 
      $id = $this->add_record($form); 

      if(array_key_exists('subforms', $_map)) 
      { 
       foreach($_map["subforms"] as $key=>$value) { 
        foreach($_data as $subform) 
        { 
         if(array_key_exists($key, $subform)) 
         { 
          $this->add_subform_records($subform[$key],$value, $form->form_id); 
         } 
        } 
       } 
      } 
    } 

} 

Таким образом, проблема заключается в том, что он добавляет первую подформу, идет добавить свои подформы (и делает), но не возвращается к for ($i = 0; $i < count($_data); ++$i), чтобы добавить остальные.

Спасибо!

$ _data

array ('_submit' => 'submit', '_submittedTime' => '1386837565194', '_submittedTimezoneOffset' => '11', 'ReportedBy' => 'test', 'DateAndTime' => '2013-12-12 19:38', 'Location' => 'hello', 'ClientName' => 'my', 'DiscussionType' => 'Meeting', 'SF_Attendees' => array (0 => array ('AttendeeName' => 'name', 'Company' => 'is', 'SF_Trip' => array (0 => array ('test1' => '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', '_action' => 'add', 'test1_mimetype' => 'image/jpeg', 'test2' => '', 'test3' => '',),), '_action' => 'add',), 1 => array ('AttendeeName' => 'S', 'Company' => 'T', '_action' => 'add',),), 'ReasonforMeeting' => 'test', 'FollowUp' => '2013-12-19 19:38', 'UserEmail' => '[email protected]', 'EmailCopyTo' => '[email protected]', 'SF_Attend' => array (0 => array ('AttendeeName' => 'test', 'Company' => 'test', '_action' => 'add',),), '_action' => 'add', '_uuid' => '63FD4677-C72A-4F1A-B711-963849B6840B', '_DateAndTime_time_offset' => '+11:00', '_FollowUp_time_offset' => '+11:00',) 

$ Карта

array ('sp_list' => 'ClientMeetingNote', 'fields' => array (0 => SchemaItem::__set_state(array('field' => 'ReportedBy', 'type' => 'textbox',)), 1 => SchemaItem::__set_state(array('field' => 'DateAndTime', 'type' => 'timestamp',)), 2 => SchemaItem::__set_state(array('field' => 'Location', 'type' => 'textbox',)), 3 => SchemaItem::__set_state(array('field' => 'ClientName', 'type' => 'textbox',)), 4 => SchemaItem::__set_state(array('field' => 'DiscussionType', 'type' => 'radio',)), 5 => SchemaItem::__set_state(array('field' => 'ReasonforMeeting', 'type' => 'text_area',)), 6 => SchemaItem::__set_state(array('field' => 'FollowUp', 'type' => 'timestamp',)), 7 => SchemaItem::__set_state(array('field' => 'Signature', 'type' => 'sketch_signature',)), 8 => SchemaItem::__set_state(array('field' => 'UserEmail', 'type' => 'email',)), 9 => SchemaItem::__set_state(array('field' => 'EmailCopyTo', 'type' => 'email',)),), 'subforms' => array ('SF_Attendees' => array ('subform_name' => 'SF_Attendees', 'subform_data_name' => 'SF_Attendees', 'sp_list' => 'Attendees', 'fields' => array (0 => SchemaItem::__set_state(array('field' => 'AttendeeName', 'type' => 'textbox',)), 1 => SchemaItem::__set_state(array('field' => 'Company', 'type' => 'textbox',)),), 'subforms' => array ('SF_Trip' => array ('subform_name' => 'SF_Trip', 'subform_data_name' => 'SF_Trip', 'sp_list' => 'Trip', 'fields' => array (0 => SchemaItem::__set_state(array('field' => 'test1', 'type' => 'camera',)), 1 => SchemaItem::__set_state(array('field' => 'test2', 'type' => 'image_library',)), 2 => SchemaItem::__set_state(array('field' => 'test3', 'type' => 'file_upload',)),),),),), 'SF_Attend' => array ('subform_name' => 'SF_Attend', 'subform_data_name' => 'SF_Attendees', 'sp_list' => 'Attendees', 'fields' => array (0 => SchemaItem::__set_state(array('field' => 'AttendeeName', 'type' => 'textbox',)), 1 => SchemaItem::__set_state(array('field' => 'Company', 'type' => 'textbox',)),), 'subforms' => array ('SF_Trip' => array ('subform_name' => 'SF_Trip', 'subform_data_name' => 'SF_Trip', 'sp_list' => 'Trip', 'fields' => array (0 => SchemaItem::__set_state(array('field' => 'test1', 'type' => 'camera',)), 1 => SchemaItem::__set_state(array('field' => 'test2', 'type' => 'image_library',)), 2 => SchemaItem::__set_state(array('field' => 'test3', 'type' => 'file_upload',)),),),),),),) 
+0

Если вы не вернетесь в цикл, вы должны бесконечно рекурсивно, так как нет выхода без продолжения итераций. Можете ли вы отправить 'var_export()' своих данных, чтобы мы могли попробовать ваши функции? – Barmar

+0

Эй, @Barmar Я прикрепил к оригинальному сообщению, когда вы запустите это, вы заметите, что он добавляет записи подформы, кроме формы участника, с именем = 's' и Company = 't' – tutts

+0

Хм, это будет сложнее, чем я думал, потому что есть зависимости от других функций и свойств в вашем классе. – Barmar

ответ

0

Фигурные это !! Если бы реструктурировать код, поскольку он дважды перебирал данные, рекурсия работала нормально, я отправлял ему неправильные данные.

Смежные вопросы