Создание JSON-формата PHP с динамическими множественными полями

#php #html #jquery #css #json

#php #HTML #jquery #css #json

Вопрос:

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

     Array
    (
        [user_id] => 
        [title2] => Billing
        [sub_title2] => to
        [emails2] => abc@gmail.com
        [sub_title3] => cc
        [emails3] => xyz@gmail.com
        [sub_title4] => for
        [emails4] => john@gmail.com
        [title5] => Free
        [sub_title5] => cc
        [emails5] => abc@gmail.com
        [sub_title6] => adf
        [emails6] => ben@gmail.com,ten@gmail.com
    )
  

Это код, который принимает данные

     $(document).on("click", "#add_section", function (e) {
      i  ; 
      k  ;
    
     var Html1 ='<div id="email_section' k '" style="margin-top: 20px" class="form-group row">';
                Html1  = '<div class="col-lg-12">';
                Html1  = '<div class="col-lg-9">';
                Html1  = '<label class="control-label col-lg-3">Add Section' i '<span style="color:red;"> *</span></label>';
                Html1  = '<div class="col-lg-9">';
                Html1  = '<input class=" form-control" id="title' i '[]" name="title' i '" type="text" placeholder="Sales" />';
                Html1  = '</div>';
                Html1  = '</div>';
                Html1  = '</div>';
                Html1  = '<div class="col-lg-12">';
                Html1  = '<div class="col-lg-9">';
                Html1  = '<label class="control-label col-lg-3"></label>';
                Html1  = '<div class="col-lg-2">';
                Html1  = '<input class=" form-control" id="sub_title' i '[]" name="sub_title' i '" type="text" placeholder="to" />';
                Html1  = '</div>';
                Html1  = '<div class="col-lg-7">';
                Html1  = '<input class=" form-control" id="emails' i '[]" name="emails' i '" placeholder="abc@gmail.com" />';
                Html1  = '</div>';
                Html1  = '</div>';
                Html1  = '<div class="col-lg-2">';
                Html1  = '<span class="btn btn-primary add_email_row" id="' k '">Add</span>';
                Html1  = '</div>';
                Html1  = '</div>';
    
      $('.modal-body').append(Html1); 
    
    
    });
    
    
    
    $(document).on("click", ".add_email_row", function (e) {
      i  ; 
      k  ;
    
      var section = $(this).attr("id");
    
      var Html = '<div id="row' i '" class="row">'; 
      Html  = '<div class="col-sm-12">';
      Html  = '<div class="col-sm-2" style="margin-left: 20px;"></div>';
      Html  = '<div class="col-sm-9">';
      Html  = '<div class="col-sm-2"><input class=" form-control" id="sub_title' i '[]" name="sub_title' i '" type="text" placeholder="to" /></div>';
      Html  = '<div class="col-sm-7"><input class=" form-control" id="emails' i '[]" name="emails' i '" type="text" placeholder="emails" /></div>';
      Html  = '<div class="col-sm-3"><a type="button" name="remove" id="' i '" class="btn btn-danger btn_remove">X</a></div>';
      Html  = '</div></div></div>';
    
    $('#email_section' section '').append(Html); 
    
    });

  

Формат JSON, который я хочу, это

     {
       "billing":{
          "to":"abc@email.com",
          "cc":"xyz@email.com",
          "adf":"mail@email.com",
          "from":""
       },
       "free":{
          "to":"abc@gmail.com,",
          "cc":"xyz@email.com",
          "adf":""
       }
    }
  

Пользовательский интерфейс PHP form для понимания нескольких динамических полей

Ответ №1:

Если форма может быть изменена, измените входные данные на массивы. Также инкапсулируйте ваши два блока и сохраните их в той же логике приращения:

 <script>

function addSection(i, k)
{
    var Html1 =
    '<div id="email_section' k '" style="margin-top: 20px" class="form-group row">'  
        '<div class="col-lg-12">'  
            '<div class="col-lg-9">'  
                '<label class="control-label col-lg-3">Add Section' i '<span style="color:red;"> *</span></label>'  
                '<div class="col-lg-9">'  
                    '<input class=" form-control" id="title' i '" name="title[' i ']" type="text" placeholder="Sales" />'  
                '</div>'  
            '</div>'  
        '</div>'  
        '<div class="col-lg-12">'  
            '<div class="col-lg-9">'  
                '<label class="control-label col-lg-3"></label>'  
                '<div class="col-lg-2">'  
                    '<input class=" form-control" id="sub_title' i '" name="sub_title[' i '][]" type="text" placeholder="to" />'  
                '</div>'  
                '<div class="col-lg-7">'  
                    '<input class=" form-control" id="emails' i '" name="emails[' i '][]" placeholder="abc@gmail.com" />'  
                '</div>'  
            '</div>'  
            '<div class="col-lg-2">'  
                '<span class="btn btn-primary add_email_row" id="' k '">Add</span>'   
            '</div>'  
        '</div>';

    $('.modal-body').append(Html1); 
}

function addEmail(obj, i, k)
{
    var section = obj.attr("id");
    var Html =
    '<div id="row' i '" class="row">'  
        '<div class="col-sm-12">'  
            '<div class="col-sm-2" style="margin-left: 20px;"></div>'  
            '<div class="col-sm-9">'  
                '<div class="col-sm-2"><input class=" form-control" id="sub_title' i '" name="sub_title[' i '][]" type="text" placeholder="to" /></div>'  
                '<div class="col-sm-7"><input class=" form-control" id="emails' i '" name="emails[' i '][]" type="text" placeholder="emails" /></div>'  
                '<div class="col-sm-3"><a type="button" name="remove" id="' i '" class="btn btn-danger btn_remove">X</a></div>'  
            '</div>'  
        '</div>'  
    '</div>';
    
    $('#email_section' section).append(Html); 
}
    
var i   =   0;
var k   =   0;
$(document).on("click", "#add_section,.add_email_row", function (e) {
    if($(this).hasClass('add_email_row')) {
        addEmail($(this), i, k);
    }
    else {
        i  ; 
        k  ;
        addSection(i, k);
    }
});

</script>
  

У вас должно остаться:

 Array
(
    [title] => Array
        (
            [1] => Section 1
            [2] => Section 2
        )

    [sub_title] => Array
        (
            [1] => Array
                (
                    [0] => subtitle1
                    [1] => subtitle2
                    [2] => subtitle3
                )

            [2] => Array
                (
                    [0] => subtitle1
                )

        )

    [emails] => Array
        (
            [1] => Array
                (
                    [0] => email1@example.com
                    [1] => email2@example.com
                    [2] => email3@example.com
                )

            [2] => Array
                (
                    [0] => email1@example.com
                )

        )

)
  

Отсюда гораздо проще получить ваш массив в php:

 $array    =   $_POST;
$new    =   [];
foreach($array['title'] as $k => $title) {
    $new[$title]    =   array_combine($array['sub_title'][$k], $array['emails'][$k]);
}

echo json_encode($new, JSON_PRETTY_PRINT);
  

Что даст вам:

  {
    "Section 1": {
        "subtitle1": "email1@example.com",
        "subtitle2": "email2@example.com",
        "subtitle3": "email3@example.com"
    },
    "Section 2": {
        "subtitle1": "email1@example.com"
    }
}
  

Комментарии:

1. Большое спасибо, Расклатт … удивительно, это именно то, что мне нужно