【发布时间】:2017-12-24 01:25:00
【问题描述】:
我有一个使用 PHP 和 foreach 循环动态生成的表单。
此表单的输入字段依次返回 3-D 数组中的数据,这样可以轻松回溯提交这些字段的位置以及如何存储它们。所以这是表格:
<?php
$i = 0;
foreach ($shop->fetch()->showResults() as $sr){
$j = 0;
if($i == 0){
echo '<div id="ser'.$sr->id.'" location = "'.$sr->id.'" class="tab-pane fade active in">';
$i++;
} else{
echo '<div id="ser'.$sr->id.'" location = "'.$sr->id.'" class="tab-pane fade">';
$i++;
}
$ser = new Service(Input::get('cd'));
$ser->fetchPriceInShop($sr->id, $ser->fetchData()->id);
foreach ($ser->fetchData() as $price){
echo '<input type="text" value="'.$price->duration.'" name="price['.$sr->id.']['.$j.'][duration]" placeholder="duration (in Minutes)">
<input type="text" value="'.$price->price.'" name="price['.$sr->id.']['.$j.'][price]" placeholder="Price ($ 100)">
<br>';
$j++;
}
echo '
<button style="float: right;" class="addPrice" type="button">+</button>
</div>';
}
?>
所以生成的表单是这样的:
<input type="text" value="10.00" name="price[1][0][price]" placeholder="Price ($ 100)">
<br><input type="text" value="20" name="price[1][1][duration]" placeholder="duration (in Minutes)">
<input type="text" value="20.00" name="price[1][1][price]" placeholder="Price ($ 100)">
<br><input type="text" value="30" name="price[1][2][duration]" placeholder="duration (in Minutes)">
<input type="text" value="30.00" name="price[1][2][price]" placeholder="Price ($ 100)">
<br>
现在,我正在尝试使此表单更灵活,我可以在其中添加更多字段并使用它们提交值。为此使用以下js:
$(".addPrice").on("click", function(){
var location = $(this).parent().attr('location');
var element = '<input type="text" placeholder="duration (minutes)" name="prices['+location+'][index][duration]">';
element += '<input type="text" placeholder="price (aud)" name="prices['+location+'][index][price]"><br>';
$(this).parent().append(element);
});
我以某种方式设法获取第一个索引(位置),最后一个索引是静态的,但我不知道如何找到生成的数组的第二个索引。请帮我找出解决方案。
PS:我是堆栈溢出的菜鸟,所以请不要苛刻。我正在学习使用这个平台。
【问题讨论】:
-
您不应该尝试为每个输入字段指定一个唯一的名称。相反,给它们所有相同的数组名称,如
name="price[]"和name="duration[]"。之后,您可以简单地在 PHP 中遍历这些数组来检索每个值。 -
对于 DRYness,如果您在 if/else 块之后编写两个
i++语句,则可以将其合并为一个语句。这样,无论$i=0是否都会保证递增。 -
也许重新配置您的多维数组结构以使用最深元素的索引。换句话说,声明为
price[$sr->id]['price'][],那么您不必为$j的递增而烦恼。然后在您的 jquery 中,您可以只使用:name="prices['+location+'][price][]",而无需搜索要使用的正确index。这与icecub建议的原则基本相同。 -
我刚刚意识到输入名称值中有一个错字——
price与prices。只是需要在每个人的代码中修复。
标签: javascript php jquery arrays forms