代码之家  ›  专栏  ›  技术社区  ›  Ryan

告诉我有更好的方法可以将这些复选框转换为JSON

  •  0
  • Ryan  · 技术社区  · 14 年前

    我正在做一个表格,让人们选择他们喜欢的联系方式。除此之外,该表单包含9个复选框(3组3个),我正试图将其作为JSON存储在我的数据库中。

    这是表格的相关部分…

    <h1 style="padding-top:25px;">Communication Preferences</h1><hr />
    <div class="onethird contactprefs" style="width: 28%">
        <h4>Preferred Method</h4>
        <p>From time to time, we might need to contact you regarding our service.  Which mode of contact would you prefer?</p>
        <p>
        <input type="checkbox" name="preferred[]" value="p" style="display: inline;" />Phone <!-- make these tooltips -->
        <br />
        <input type="checkbox" name="preferred[]" value="e" style="display: inline;" checked />Email
        <br />
        <input type="checkbox" name="preferred[]" value="s" style="display: inline;" />SMS
        </p>
    </div>
    
    <div class="onethird contactprefs" style="width: 28%; border-left: solid 1px #cdcdcd; border-right: solid 1px #cdcdcd; padding-left: 18px; padding-right: 15px;">
        <h4>Weather Delays</h4>
        <p>We don't mess with Mother Nature, and sometimes she forces us to cancel service.  If that happens, how should we inform you?</p>
        <p>
        <input type="checkbox" name="weather[]" value="p" style="display: inline;" />Phone
        <br />
        <input type="checkbox" name="weather[]" value="e" style="display: inline;" checked />Email
        <br />
        <input type="checkbox" name="weather[]" value="s" style="display: inline;" />SMS
        </p>
    </div>
    
    <div class="onethird contactprefs" style="width: 28%">
        <h4>Holiday Reminders</h4>
        <p>If you'd like us to send you reminders about interruptions in service due to holidays, just choose your preferred method below.</p>
        <p>
        <input type="checkbox" name="holiday[]" value="p" style="display: inline;" />Phone
        <br />
        <input type="checkbox" name="holiday[]" value="e" style="display: inline;" checked />Email
        <br />
        <input type="checkbox" name="holiday[]" value="s" style="display: inline;" />SMS
        </p>
    
    </div>
    
     <!-- end contact preferences -->
    

    正如我提到的,我需要从这些复选框中获取数据,并将其转换为格式良好的JSON字符串。

    这是我正在做的,但看起来很乱。告诉我有更好的方法…

    /* THERE MUST BE A BETTER WAY TO DO THIS */
    // get the preferred data
    $preferred = $this->input->post('preferred');
    
    if(in_array('p',$preferred)){
        $pref['p'] = 1;
    }else{ $pref['p'] = 0;}
    
    if(in_array('e',$preferred)){
        $pref['e'] = 1;
    }else{ $pref['e'] = 0;}
    
    if(in_array('s',$preferred)){
        $pref['s'] = 1;
    }else{ $pref['s'] = 0;}
    
    // get the weather data
    $weather = $this->input->post('weather');
    
    if(in_array('p',$weather)){
        $wea['p'] = 1;
    }else{ $wea['p'] = 0;}
    
    if(in_array('e',$weather)){
        $wea['e'] = 1;
    }else{ $wea['e'] = 0;}
    
    if(in_array('s',$weather)){
        $wea['s'] = 1;
    }else{ $wea['s'] = 0;}
    
    // get the holiday data
    $holiday = $this->input->post('holiday');
    
    if(in_array('p',$holiday)){
        $hol['p'] = 1;
    }else{ $hol['p'] = 0;}
    
    if(in_array('e',$holiday)){
        $hol['e'] = 1;
    }else{ $hol['e'] = 0;}
    
    if(in_array('s',$holiday)){
        $hol['s'] = 1;
    }else{ $hol['s'] = 0;}
    
    $contact_prefs = array('preferred' => $pref,'weather' => $wea,'holiday' => $hol);
    $contact_prefs = json_encode($contact_prefs);
    

    提前感谢您的洞察力。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Felix Kling    14 年前

    一个让它更自动的想法( 未经测试的 ):

    $contact_prefs = array();
    $groups = array('preferred', 'weather', 'holiday'); // checkbox groups
    
    foreach($groups as $group) {
        $preferences = array('p' => 0, 'e' => 0, 's' => 0); // create default array
        $values = $this->input->post($group); // get the checked values for a group
        foreach($values as $value) {
            $preferences[$value] = 1; // if box is checked, set value to 1
        }
        $contact_prefs[$group] = $preferences;
    }
    
    $contact_prefs = json_encode($contact_prefs);
    

    当然,这只在三个复选框组具有相同值时才有效。