走过php阵列

时间:2013-07-20 18:16:54

标签: php arrays multidimensional-array

任何人都可以通过以下方式指出我正确的方向

我在FROM中有这个HTML(本例简化):

===============启动HTML ===================

<select name="Postage[]" id="Unique-ID">
    <option value="1">Postage Option 1</option>
    <option value="2">Postage Option 2</option>
    <option value="3">Postage Option 3</option>
</select>
<input name="PostagePrice[]" id="Price-Unique-ID" value="" />

<select name="Postage[]" id="Unique-ID">
    <option value="1">Postage Option 1</option>
    <option value="2">Postage Option 2</option>
    <option value="3">Postage Option 3</option>
</select>
<input name="PostagePrice[]" id="Price-Unique-ID" value="" />

<select name="Postage[]" id="Unique-ID">
    <option value="1">Postage Option 1</option>
    <option value="2">Postage Option 2</option>
    <option value="3">Postage Option 3</option>
</select>
<input name="PostagePrice[]" id="Price-Unique-ID" value="" />

==================结束HTML =====================

我从表单中收集它并使用以下代码将其设置为数组($ arrPostageOptions):

===============启动PHP ===================

if (isset($_POST['Postage'])) {
    if (is_array($_POST['Postage'])) {
        $n = count($_POST['Postage']);
        for ($i = 0; $i < $n; ++$i) {
            // check to only collect completed entries
            if( !empty($_POST['Postage'][$i]) && !empty($_POST['PostagePrice'][$i]) ){
                // assign to array
                $arrPostageOptions[$i] = array( "Postage" => $_POST['Postage'][$i], "PostagePrice" => $_POST['PostagePrice'][$i], );
            }
        }
    }
}  

===============结束PHP ===================

这会产生以下数组

============数组结果===============

Array(
    [0] => Array
        (
            [Postage] => 1
            [PostagePrice] => 12
        )
    [1] => Array
        (
            [Postage] => 2
            [PostagePrice] => 24
        )
    [2] => Array
        (
            [Postage] => 3
            [PostagePrice] => 48
        )
)

============结束数组结果===============

我想要的答案(我认为)是每个数组:

1 & 12

2 & 24

3 & 48

(数组编号与邮资编号匹配只是巧合,我只想要'邮资'和'邮资价格')

我正在尝试以下方法:

===========我正在尝试的开始==========

foreach ($arrPostageOptions as $id) {
    while ($id) {
        $Postage = $id["Postage"];
        $PostagePrice = $id["PostagePrice"];
        // echo $Postage.' '.$PostagePrice.'<br>';
        unset($id);
        if (!$listing_obj->addPostageOptions($ListingID, $PostageOptionID, $PostagePrice, $db)) {
           $err_text .= 'An error occurred adding Postage Option'.$PostageOptionID;
        }
    }   
}

======我正在尝试的结束==============

不幸的是,这不符合我的预期(但是我得到的最接近)。我也试过了多个foreach循环,但我再也没有得到什么 (令我不安的是$ id阻止循环继续,但也给了我PHP未知定义变量$ id的通知)

我确定我知道如何做到这一点,但似乎已经忘记并且可能因为这些阵列仍然让我感到困惑而感到困惑。

任何建议都会受到欢迎!

4 个答案:

答案 0 :(得分:1)

我不完全确定我理解你想要做什么,但在我看来你想要像这样迭代数组,但我不确定。

foreach ($arrPostageOptions as $id=>$array) {
  foreach($array as $key=>$val){
    // do your stuff here using where you can also reference $id
  }
}

答案 1 :(得分:1)

为什么不简单:

foreach ($arrPostageOptions as $postageOption) {
    $postage = $postageOption["Postage"];
    $postagePrice = $postageOption["PostagePrice"];
    echo $postage.' '.$postagePrice.'<br>';
    ...
}

很抱歉重命名,但$ id对我来说太混乱了。

答案 2 :(得分:1)

我想说的是,isset函数在这里有点无意义,最好与提交按钮一起使用,而不是用于文本字段和其他输入。

此外,您在循环中声明您的数组,因此在外部任何地方访问它都会产生未定义的错误。

我刚刚使用了您的表单并稍微更新了php脚本以提供您想要的输出。请看看。

您的表格

<form action="yourscript.php" method="POST">

    <select name="Postage[]" id="Unique-ID">
    <option value="1">Postage Option 1</option>
    <option value="2">Postage Option 2</option>
    <option value="3">Postage Option 3</option>
    </select>
    <input name="PostagePrice[]" id="Price-Unique-ID" value="" />

    <select name="Postage[]" id="Unique-ID">
        <option value="1">Postage Option 1</option>
        <option value="2">Postage Option 2</option>
        <option value="3">Postage Option 3</option>
    </select>
    <input name="PostagePrice[]" id="Price-Unique-ID" value="" />

    <select name="Postage[]" id="Unique-ID">
        <option value="1">Postage Option 1</option>
        <option value="2">Postage Option 2</option>
        <option value="3">Postage Option 3</option>
    </select>
    <input name="PostagePrice[]" id="Price-Unique-ID" value="" />

    <input type="submit" value="submit" name="submit"/>

    </form>

我在标题中添加了一个提交按钮和方法及操作,以使其更清晰。

这是我使用的脚本,非常类似于你的脚本

<?php

    $arrPostageOptions = array();

    if(isset($_POST['submit']))
    {
        $postage = $_POST['Postage'];
        $postagePrice = $_POST['PostagePrice'];

        $array_size = count($postage);

        for($i = 0; $i < $array_size; $i++)
        {
            if(!empty($postage[$i]) && !empty($postagePrice[$i]))
            {
                $arrPostageOptions[$i] = array("Postage"=>$postage[$i], 
                            "PostagePrice"=>$postagePrice[$i]);  
            }
        }
        print_r($arrPostageOptions);
    }

?>

我检查是否设置/单击了提交按钮并进入循环。我在外面定义了数组变量,因此它可以在程序的任何地方使用。

如果看到print_r结果,您将看到所需格式的数组。

我希望我回答你的几个问题。

同时,最好在使用它们之前始终将POST数据放入变量中,以便检查它们并比直接使用$ _POST ['name']更好地控制它们。当您使用数据库和其他相关事物时,这将更有用。

希望这有帮助。

谢谢, 肖恩。

答案 3 :(得分:0)

while中的foreach是多余的。只要有新条目成为foreach无论如何,$id只会继续。

如果你删除while,循环应该没问题。如果要测试数据是否有效,请测试数组键本身,例如将其放入循环

if(!$id["Postage"] || !$id["PostagePrice"]){
  continue;  
  }