2015-06-16 2 views
1

Я проверил различные вопросы SOОтправка нескольких групп флажков PHP с помощью AJAX

  1. How to send a checkbox group via ajax in jquery?
  2. serializing checkboxes in jQuery

Но ни один из них не посылать больше, чем один набор флажков.

У меня есть форма с серией флажков:

<input type="checkbox" name="color[]" value="1"/> 
<input type="checkbox" name="color[]" value="2"/> 
... 
<input type="checkbox" name="size[]" value="1"/> 
<input type="checkbox" name="size[]" value="2"/> 
... 

Есть также некоторые другие не флажки на форме.

Я посылаю это PHP с помощью AJAX:

$.ajax({ 
    url: '/filter', 
    type: 'POST', 
    data: { filter: $(self.form).serializeArray()}, 
    dataType: 'JSON' 
}); 

Я тогда должен получить каждый набор значений флажок в PHP. Поэтому я выхожу сообщение:

array (size=4) 
    0 => 

array (size=2) 
    'name' => string 'color[]' (length=7) 
    'value' => string '4' (length=1) 
1 => 
array (size=2) 
    'name' => string 'color[]' (length=7) 
    'value' => string '6' (length=1) 
2 => 
array (size=2) 
    'name' => string 'length[]' (length=8) 
    'value' => string '3' (length=1) 
3 => 
array (size=2) 
    'name' => string 'length[]' (length=8) 
    'value' => string '5' (length=1) 

Но как я могу получить каждый набор значений? Я хочу var со всеми цветами и var со всеми размерами.

Просто уточнить - я ищу способ в PHP, чтобы получить цвета в массив и еще один массив для lenths.

Что-то вроде:

$_POST['filter']['color']; 
+0

Код выглядит хорошо !!! –

+0

'$ (self.form) .serializeArray()' отлично выглядит, и он должен это делать. Вы проверили вывод в консоли? –

+0

Я считаю, что вы попробовали [this] (http://stackoverflow.com/a/9298836/3282633) тоже –

ответ

-2
<?php 
$colors = $_POST['filter']['color']; 

print_r($colors); 
?> 
+0

Это не очень полезно. Добавьте код вокруг кода. Объясните, что вы делаете. – Mika

0

Вы хотите результат уже был массив из проверяемого значения, когда отправить PHP? Если это так, то вам необходимо предварительно обработать его:

var result = []; 
$('input[type="checkbox"][name="color[]"]').each(function(_, ele) { 
    if ($(ele).prop('checked')) { 
     result.push($(ele).attr('value')); 
     } 
}); 

Надежда его, что вы хотите.

+0

Нет ли более простого способа сделать это с помощью сериализации. – panthro

+0

Насколько мне известно, вам нужно либо обрабатывать его в php, используя forloop, чтобы проверить имя каждого элемента и получить его значение для исправления места, либо вам нужно сформировать результат в javascript перед отправкой, извините, я не уверен, что есть более элегантный способ его решения. – fuyushimoya

+0

Хорошо, спасибо за ваш ответ. Очень признателен. – panthro

0

Вот немного PHP кода, который превратит ваш $_POST в новый массив называется $filter

$filter = array(); 
foreach ($_POST as $checkbox) { 
    if (substr($checkbox['name'],-2) == '[]') { 
     $name = substr($checkbox['name'],0,-2); 
     if (!array_key_exists($name,$filter)){ 
      $filter[$name] = array(); 
     } 
     array_push($filter[$name],$checkbox['value']); 
    } 
} 
print_r($filter); 

Что это делает:

  1. Проверяется name заканчивается [], если это так предполагается, что это флажок, если он не игнорируется.
  2. Это создаст новый массив в $filter, который содержит массив для каждой группы CheckBox

Так $filter вашему примеру $_POST будет выглядеть следующим образом:

Array ( 
    ['color'] => Array ( 
    [0] => 4 
    [1] => 6 
) 
    ['length'] => Array ( 
    [0] => 3 
    [1] => 5 
) 
) 
Смежные вопросы