匹配数组元素以获取另一个索引处的数组元素

时间:2010-04-02 18:20:18

标签: php arrays foreach

我有一个PHP数组,我用它来生成HTML表单。 PHP数组是这样的:

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

生成HTML表单的PHP如下所示。我需要将值作为状态的名称,因为我正在使用一些AJAX来显示用户选择的状态。

<?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>";
?>

我要做的是,在提交表单时,使用用户选择的状态,遍历PHP数组并从所选状态中总计数字。因此,如果我查看了阿拉巴马州和阿拉斯加州,我想添加275 + 197。

这是我认为会起作用的,但事实并非如此:

<?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++;
    }
?>

然后$ ven_total应该是我正在寻找的总数。但是,$ ven_total最终成为第一个选中的复选框,它忽略了其余的复选框。我正在使用AJAX正确地执行此操作,在前端显示总数,但我不知道如何将其传递给表单提交。我宁愿不使用GET和URL变量,因为用户可以在URL中键入内容并修改计数。知道我做错了什么,或者更好的方法来解决这个问题,我能够理解吗? (非常新手程序员。)

2 个答案:

答案 0 :(得分:0)

为什么不将数字用作$ vdb数组的键?

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

然后

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

array_intersect()函数比较两个或多个数组,并返回一个数组,其中包含来自第一个数组的键和值,前提是该值存在于所有其他数组中。

答案 1 :(得分:0)

这个答案最终会有几个不同的建议,但请耐心等待。 首先,使用列表作为数据结构变得混乱,因为你最终忘记了索引1的实际含义。因此,由于您不仅仅具有名称与值的配对,您可以尝试将其作为基本类,并使您的代码更具可读性。

<?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
?>

这仍然是你的代码刚刚清理了一些。循环和添加似乎工作正常。您是否已完成print_r($_POST)以确保以您期望的方式获得价值?您提到不想使用GET,但POST可以像GET一样欺骗,始终验证用户的输入。