Соответствие элементам массива для получения элемента массива по другому индексу - PullRequest
0 голосов
/ 02 апреля 2010

У меня есть массив PHP, который я использую для создания формы HTML. Массив PHP таков:

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

PHP для генерации HTML-формы приведен ниже. Мне нужно, чтобы значением было имя состояния, потому что есть некоторый 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 голосов
/ 02 апреля 2010

В итоге у этого ответа будет пара разных предложений, но потерпите меня. Во-первых, использование списка в качестве структуры данных становится беспорядочным, потому что вы в конечном итоге забываете, что на самом деле означает индекс 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, всегда проверяйте ввод от пользователя.

0 голосов
/ 02 апреля 2010

почему вы не используете число в качестве ключа для массива $ 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 () сравнивает два или более массивов и возвращает массив с ключами и значениями из первого массива, только если значение присутствует во всех других массивах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...