Başka bir dizin bir dizi elemanı almak için bir dizi öğelerini Eşleştirme

2 Cevap php

Ben bir HTML formu oluşturmak için kullanıyorum bir PHP dizi var. PHP dizi şudur:

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

HTML formu oluşturmak için PHP altındadır. Ben bir kullanıcının seçtiği hangi devletler görüntülemek için kullanıyorum bazı AJAX var çünkü ben, değer devletin adı olması olması gerekir.

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

Ne yapmaya çalışıyorum kullanıcı seçilen devletler, PHP dizi aracılığıyla döngü ile, formun sunulması üzerine, ve seçilen devletlerin sayıları toplam. Ben Alabama ve Alaska kontrol eğer öyleyse, ben + 197 275 eklemek isterdim.

Bu çalıştığım olurdu düşündüm, ama öyle değil:

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

ve sonra $ ven_total aradığım toplam olmalıdır. Ancak, $ ven_total sadece seçilen ilk onay kutusunu olmak biter, ve gerisini yok sayar. Ben ön ucunda toplam görüntüleme, AJAX ile doğru yapıyorum, ama ben form teslimi için o geçmek nasıl bilmiyorum. Bir kullanıcı URL içine bir şeyler yazıp sayısını değiştirebilir çünkü ben oldukça, GET ve URL değişkenleri kullanarak istemem. Ben ne yapıyorum yanlış bir fikrin, ya da anlamak mümkün olacağını, bu yaklaşım için daha iyi bir yolu? (Pek bir acemi programcı.)

2 Cevap

This answer is going to end up having a couple different suggestions, but bear with me. First off, using a list as a data structure gets messy because you end up forgetting what index 1 actually means. So, since you have more than just a pairing of name to value, you can try making it a basic class and make your code more readable.

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

Bu hala kod sadece bazı kadar temizlenir. Loop ekleyerek iyi çalışıyor gibi görünüyor. Eğer print_r($_POST) siz değerleri beklediğiniz şekilde aldığınızdan emin olmak için yapılır mı? Sen GET kullanmak isteyen değil bahsedilen, ama POST sadece, her zaman kullanıcı girişi doğrulamak GET gibi sahte olabilir.

neden $ vdb diziye bir anahtar olarak numarayı kullanmak değil mi?

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

ve daha sonra

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

Array_Intersect () işlevi, değeri, diğer dizilerin hepsi mevcut yalnızca, iki veya daha fazla diziler karşılaştırır ve birinci diziden anahtarları ve değerleri ile bir dizi döndürür.