web-dev-qa-db-fra.com

Comment sélectionner toutes les entrées ayant le même nom et les indexer par leur nom

Je dois manipuler un formulaire généré par une troisième partie. Ce formulaire fournit des attributs de case à cocher "à sélection multiple". Mais le nom de l'entrée est identique et PHP $ _POST ne peut pas gérer des clés identiques (seules les dernières données sont traitées).

Voici un exemple de formulaire:

<form>
    <input type="checkbox" name="attr1" value="1" />
    <input type="checkbox" name="attr1" value="2" />
    <input type="checkbox" name="attr1" value="3" />
    <input type="checkbox" name="attr1" value="4" />
    <input type="checkbox" name="attr2" value="xx" />
    <input type="checkbox" name="attr3" value="a" />
    <input type="checkbox" name="attr3" value="b" />
    <input type="checkbox" name="attr3" value="c" />
    <input type="checkbox" name="attr3" value="d" />
    <input type="text" name="attr4" value="" />
</form>

J'aimerais analyser toutes les entrées de case à cocher, obtenir uniquement les entrées du même nom et ajouter "[]" à leur nom ...

Ce que je veux obtenir après le traitement jQuery:

<form>
    <input type="checkbox" name="attr1[]" value="1" />
    <input type="checkbox" name="attr1[]" value="2" />
    <input type="checkbox" name="attr1[]" value="3" />
    <input type="checkbox" name="attr1[]" value="4" />
    <input type="checkbox" name="attr2" value="xx" />
    <input type="checkbox" name="attr3[]" value="a" />
    <input type="checkbox" name="attr3[]" value="b" />
    <input type="checkbox" name="attr3[]" value="c" />
    <input type="checkbox" name="attr3[]" value="d" />
    <input type="text" name="attr4" value="" />
</form>

Existe-t-il un moyen d'identifier un groupe d'entrées portant le même nom?

13
AlterPHP

Ceci ajoutera [] au nom de chaque élément de case à cocher s'il existe un autre élément portant le même nom.

var name_map = {};
$("input[type=checkbox]")  // for all checkboxes
    .each(function() {  // first pass, create name mapping
        var name = this.name;
        name_map[name] = (name_map[name]) ? name + "[]" : name;
    })
    .each(function() {  // replace name based on mapping
        this.name = name_map[this.name];
    });

Démo: http://jsfiddle.net/gnfsG/

20
Shawn Chin

Essaye ça:

var group = $('input[name="attr1"]');

if (group.length > 1){
   group.each(function () {
        $(this).attr("name",$(this).attr("name")+"[]");
   });
}
4
Christoph

Vous devrez utiliser $('input[name^="attr"]') dans votre cas. Comme vos articles ont attr1, attr2, attr3 etc. Le sélecteur ci-dessus correspond à tous.

Vous pouvez vérifier cela en action @ http://jsfiddle.net/cT78Y/2/

$('input[name^="attr"]:checkbox').each(function(i){
   $(this).attr("name",$(this).attr("name")+"[]");
});

Cela vous donnera.

<form>
  <input type="checkbox" name="attr1[]" value="1">
  <input type="checkbox" name="attr1[]" value="2">
  <input type="checkbox" name="attr1[]" value="3">
  <input type="checkbox" name="attr1[]" value="4">
  <input type="checkbox" name="attr2[]" value="xx">
  <input type="checkbox" name="attr3[]" value="a">
  <input type="checkbox" name="attr3[]" value="b">
  <input type="checkbox" name="attr3[]" value="c">
  <input type="checkbox" name="attr3[]" value="d">
  <input type="text" name="attr4" value="">
</form>

J'espère que cela vous aide.

1
Amar Palsapure
$("input[name=attr\\[\\]]");

obtenir toutes les entrées où nom = attr[]

0
runphp

C'est une très longue solution

var array =[];
                $('input[type="checkbox"]').each(function(){
                    array.Push($(this).attr('name'));
                });

                var sorted_arr = array.sort(); // You can define the comparing function here.
                // JS by default uses a crappy string compare.
                var results = [];
                for (var i = 0; i < array.length - 1; i++) {
                    if (sorted_arr[i + 1] == sorted_arr[i]) {
                        results.Push(sorted_arr[i]);
                    }
                }
                var names = [];
                names = jQuery.unique(results);
                $.each(names ,function(key,value){
                    $('input[name ="'+value+'"]').attr("name",value+"[]");
                });
0
Poonam