2010-04-02 10 views
0

J'ai un tableau PHP que j'utilise pour générer un formulaire HTML. Le tableau PHP est ceci:Correspondance des éléments de tableau pour obtenir un élément de tableau à un autre index

<?php 
$vdb = array (
     array( "Alabama",    275), 
     array( "Alaska",    197), 
     array( "Arizona",    3322)); 
?> 

Le PHP pour générer le formulaire HTML est ci-dessous. J'ai besoin que la valeur soit le nom de l'état, car il y a du AJAX que j'utilise pour afficher les états que l'utilisateur a choisis.

<?php 
    echo "<table border='1'><thead><tr><th></th><th>State</th><th>Contacts</th><th>Email</th></tr></thead>"; 
    for ($row = 0; $row < 42; $row++) { 
     echo "<tr><td class='input_button'><input type='checkbox' name='vdb[]' value='".$vdb[$row][0]."' title='".$vdb[$row][1]."' /></td>"; 
     echo "<td>".$vdb[$row][0]."</td>"; 
     echo "<td>".$vdb[$row][1]."</td>"; 
    } 
    echo "</table>"; 
?> 

Ce que je suis en train de faire est, sur présentation de la forme, avec les états de l'utilisateur sélectionné, boucle à travers le réseau de PHP et le total des chiffres des états sélectionnés. Donc, si je vérifié l'Alabama et de l'Alaska, je veux ajouter 275 + 197.

C'est ce que je pensais avoir travaillé, mais ce n'est pas:

<?php 
    $vendors = array(); 
    if (isset($_POST["vdb"])) { 
     $vendors = $_POST["vdb"]; 
    } 

    $ven_i = 0; 
    $ven_j = 0; 
    $ven_total = 0; 
    foreach ($vendors as $value) { 
     foreach ($vdb as $vdb_value) { 
      if ($vendors[$ven_i] == $vdb[$ven_j][0]) { 
       $ven_total += $vdb[$ven_j][1];         
      } 
      $ven_j++; 
     } 
     $ven_i++; 
    } 
?> 

puis ven_total $ devrait être le total Je cherche. Cependant, $ ven_total finit par être la première case cochée, et elle ignore le reste. Je le fais correctement avec l'AJAX, affichant le total sur le front-end, mais je ne sais pas comment le transmettre à la soumission du formulaire. Je préfère ne pas utiliser les variables GET et URL, car un utilisateur pourrait saisir quelque chose dans l'URL et modifier le nombre. Une idée de ce que je fais mal, ou une meilleure façon d'aborder ce que je serais capable de comprendre? (Très un programmeur novice.)

+0

Comment est construit le tableau '$ vdb'? Est-ce que ça vient d'une mysql_query ou quelque chose? Est-ce que c'est codé statiquement? –

+0

Si vous n'utilisez jamais $ value ou $ vdb_value ET que vous effectuez des appels index ++, pourquoi utilisez foreach au lieu d'un normal? – unholysampler

+0

@smotchkkiss $ vdb est un tableau statique, les numéros sont mis à jour manuellement tous les deux semaines/mois. @unholysampler Je suppose que je pourrais utiliser pour, j'utilisais foreach parce qu'il s'arrête automatiquement à la fin du tableau, non? Je n'aurais pas à m'inquiéter d'en répéter un trop ou un trop peu de fois. Et en fait, je suppose que je pourrais utiliser $ value au lieu de $ vendeurs [$ ven_i] – bccarlso

Répondre

0

Cette réponse va finir par avoir quelques suggestions différentes, mais supporter avec moi. Tout d'abord, l'utilisation d'une liste comme structure de données devient compliquée car vous finissez par oublier ce que l'index 1 signifie réellement. Ainsi, puisque vous avez plus qu'un appariement de noms à valeur, vous pouvez essayer d'en faire une classe de base et rendre votre code plus lisible.

<?php 
class State { 
    public $name; 
    public $contact_count; 
    public $email_count; 

    function __construct($name, $contact_count, $email_count) { 
     $this->name = $name; 
     $this->contact_count = $contact_count; 
     $this->email_count = $email_count; 
    } 
} 

$states = array (
    new State("Alabama", 275, 210), 
    new State("Alaska", 197, 149), 
    new State("Arizona", 3322, 2145)); 

$selected_vendors = array("Alabama", "Arizona"); 

$ven_total = 0; 
foreach ($selected_vendors as $selected) { 
    foreach ($states as $state) { 
     if ($selected == $state->name) { 
      $ven_total += $state->contact_count;         
     } 
    } 
} 
echo $ven_total 
?> 

Ceci est toujours votre code juste nettoyé certains. Le bouclage et l'ajout semble fonctionner correctement. Avez-vous fait print_r($_POST) pour vous assurer que vous obtenez les valeurs comme vous l'attendez? Vous avez mentionné ne pas vouloir utiliser GET, mais POST peut être usurpé comme GET, toujours valider l'entrée de l'utilisateur.

+0

Merci unholysampler. Je sais que ça fait quelques jours mais je reviens juste à ce projet et cette solution a l'air beaucoup plus propre que ce que j'ai actuellement. Je vais essayer. Oui, j'ai besoin de valider ce formulaire, mais j'avais du mal à faire valider jQuery pour travailler avec le plugin FormToWizard jQuery que j'utilise pour transformer cette chose en un assistant. Merci pour l'aide cependant, je vais le tester! – bccarlso

+0

Heureux d'entendre que vous étiez capable de comprendre ce que j'ai écrit. N'oubliez pas d'accepter si cela finit par être la bonne réponse. – unholysampler

0

pourquoi n'utilisez-vous pas le nombre comme une clé pour le tableau $ vdb?

$vdb = array (
      array(275=>"Alabama"), 
      array(197=>"Alaska"), 
      array(3322=>"Arizona") 
    ); 

puis

$sum = array_intersect($vdb, $vendors); 
$total = 0; 
foreach ($sum as $key=>$value) { 
    $total = $total+$key; 
} 
unset($key, $value, $sum); 

La fonction array_intersect() compare deux ou plusieurs réseaux, et retourne un tableau avec les clés et les valeurs de la première matrice, uniquement si la valeur est présente dans toutes les autres tableaux.

+0

Peut-être que je aurais dû inclure cela dans le message original, mais le tableau ressemble réellement ceci: VDB de $ = array ( \t \t // \t \t Etat \t \t \t \t \t # \t \t Email \t tableau \t (\t " Alabama », \t \t \t \t 275, \t 210), \t tableau \t (\t "Alaska", \t \t \t \t 197, \t 149), \t \t tableau (\t "Arizona", \t \t \t \t 3322, \t 2145)); – bccarlso

+0

Qu'est-ce que les chiffres représentent? –

Questions connexes