2010-04-02 6 views
0

HTML 폼을 생성하는 데 사용하는 PHP 배열이 있습니다. 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에서이 작업을 올바르게 수행하고 있지만 폼 제출에이를 전달하는 방법을 모르겠습니다. 사용자가 URL에 무언가를 입력하고 개수를 수정할 수 있기 때문에 GET 및 URL 변수를 사용하지 않을 것입니다. 내가 잘못하고있는 것, 또는 이것에 접근하는 더 좋은 방법은 내가 이해할 수있을 것입니다. (아주 초보 프로그래머.)

+0

'$ vdb' 배열은 어떻게 구축되고 있습니까? 그것은 mysql_query 나 다른 것에서 오는 것입니까? 정적으로 코딩 되었습니까? –

+0

$ value 또는 $ vdb_value를 절대 사용하지 않고 index ++ 호출을 수행하는 경우 왜 표준 대신 foreach를 사용합니까? – unholysampler

+0

@smotchkkiss $ vdb는 정적 배열이며 숫자는 몇 주/개월마다 수동으로 업데이트됩니다. @unholysampler 내가 배열의 끝에 자동으로 멈추기 때문에 나는 foreach를 사용하고 있었다. 너무 많은 것을 반복하거나 너무 적은 것을 반복하는 것에 대해 걱정할 필요가 없습니다. 그리고 실제로, 나는 $ vendors [$ ven_i] 대신 $ value를 사용할 수 있다고 생각합니다. – bccarlso

답변

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처럼 스푸핑 될 수 있으며 항상 사용자로부터의 입력을 검증합니다.

+0

감사합니다. 나는 며칠이 걸렸다는 것을 알고 있지만, 나는이 프로젝트로 돌아가고 있으며,이 솔루션은 현재 가지고있는 것보다 훨씬 더 깨끗해 보인다. 나는 그것을 줄 것이다. 그래,이 양식의 유효성을 검사해야하지만이 문제를 마법사로 바꾸는 데 사용하는 FormToWizard jQuery 플러그인에서 jQuery 유효성 검사를 수행하는 데 문제가 발생했습니다. 도움을 주셔서 감사합니다, 나는 그것을 밖으로 테스트 할 것입니다! – bccarlso

+0

내가 쓴 것을 당신이 이해할 수 있었다니 기쁘다. 그것이 올바른 대답이되면 받아들이는 것을 잊지 마십시오. – unholysampler

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); 

함수 값이 모두 존재할 때에 만, 둘 개 또는 그 이상의 배열을 비교하고, 제 1 어레이의 키와 값 배열을 반환()를는 array_intersect 다른 배열.

+0

아마 나는 원래의 게시물이를 포함해야하지만, 배열은 실제로 다음과 같습니다 $의 VDB = 배열 ​​( \t \t // \t \t 주 \t \t \t \t \t # \t \t 이메일 \t \t 배열 (\t " 알라 "\t \t \t \t 275 \t 210) \t \t 어레이 (\t"알래스카 "\t,210 \t \t 197 \t 149) \t \t 어레이 (\t "애리조나"\t \t \t \t 3322, \t 2145)); – bccarlso

+0

숫자는 무엇을 나타 냅니까? –