php - PHP foreach() 只输出数组的最后一项
问题描述
作为我上一篇文章的续集,我的目的只是让我的问题直截了当且简短,但显然,为了清楚起见,最好包括所有涉及的模块。
我正在开发一个 CodeIgniter 项目,该项目要求用户在输入后数组的帮助下提供多个选项,如下图所示:
<form action="javascript:void(0)" id="add_stock">
<div class="stock">
<div>
<div class="form-group col-md-4">
<input type="text" name="item[]" placeholder="Name of item" class="form-control item" id="item" />
<span class="item_err"></span>
</div>
<div class="form-group col-md-4">
<input type="text" name="unit[]" list="units" placeholder="Enter unit of measurement" class="form-control unit" id="unit" />
<datalist id="units">
<option>cube</option>
<option>cup</option>
</datalist>
<span class="unit_err"></span>
</div>
<div class="form-group col-md-3">
<input type="text" onfocus="(this.type='number')" name="quantity[]" placeholder="Enter quantity" class="form-control quantity" id="quantity" />
<span class="quantity_err"></span>
</div>
<div class="form-group col-md-1">
<button class="btn btn-primary add-more-stock" title="Add more item" style ="height:33px;margin-top: ;"><i class="fa fa-plus"></i></button>
</div>
<div class="clearfix"></div>
</div>
</div>
<div class="clearfix"></div>
<div class="form-group msg"></div>
<div class="form-group col-md-12">
<button class="btn btn-primary add-stock text-uppercase"><i class="fa fa-plus"></i> add stock</button>
</div>
</form>
我有一个 jQuery 代码,它附加了额外的输入字段,如下所示:
var max_fields = 20; // maximun inputs allowed
var items = $('.stock');
var x = 1;
$('.add-more-stock').click(function (e) {
e.preventDefault();
if (x < max_fields) {
x++;
$('.stock').append('<div><div class="form-group col-md-4"><input type="text" name="item[]" placeholder="Name of item" class="form-control item" id="item" /><span class="item_err"></span></div><div class="form-group col-md-4"><input type="text" name="unit[]" list="units" placeholder="Enter unit of measurement" class="form-control unit" id="unit" /><datalist id="units"><option>cube</option><option>cup</option><option>mudu</option><option>bags</option><option>carton</option> <option>crate</option> <option>bottle</option></datalist><span class="unit_err"></span></div><div class="form-group col-md-3"><input type="text" name="quantity[]" placeholder="Enter quantity" class="form-control quantity" id="quantity" /> <span class="quantity_err"></span></div><button class="btn btn-danger remove-stock col-sm-1" title="Remove item" style ="height:33px;margin-bottom: -1px; width: 40px;"><i class="fa fa-trash"></i></button></div>');
}else{
$('.input-alert').attr('class','alert alert-warning').html('<i class="fa fa-info-circle"></i> You have reached the maximun of 20 input fields reached.').show();
}
})
$(items).on('click','.remove-stock',function (e) {
e.preventDefault();
$(this).parent('div').remove();
$('.input-alert').hide();
})
这是将文本字段的内容传递给我的控制器的完整 jQuery 代码:
$('.add-stock').click(function (e) {
var item = new Array();
var unit = new Array();
var quantity = new Array();
var item_arr = $("input[name^='item']");
var unit_arr = $("input[name^='unit']");
var quantity_arr = $("input[name^='quantity']");
item_arr.each(function(){
item.push(this.value);
});
unit_arr.each(function(){
unit.push(this.value);
});
quantity_arr.each(function(){
quantity.push(this.value);
});
$.ajax({
url: '<?php echo base_url()?>admin/add_stock',
type: 'post',
data: {item:item,unit:unit,quantity:quantity},
dataType: 'json',
beforeSend: function () {
$(".add-stock").html("<img src='<?php echo base_url()?>asset/images/a.gif' width='20' height='20'/> proceesing...");
},
success: function (data) {
if (data.success) {
$('.add-stock').html('<i class="fa fa-plus"></> add stock');
$('.msg').attr('class', 'alert alert-success').html('<i class="fa fa-check"></> '+data.msg).delay(5000).fadeOut();
}else if (data.error) {
if (data.unit) {
$('.add-stock').html('<i class="fa fa-plus"></> add stock');
$('.unit_err').attr('class', 'text-danger').html(data.unit).delay(5000).fadeOut();
}else if (data.item) {
$('.add-stock').html('<i class="fa fa-plus"></> add stock');
$('.item_err').attr('class', 'text-danger').html(data.item).delay(5000).fadeOut();
}else if (data.quantity) {
$('.add-stock').html('<i class="fa fa-plus"></> add stock');
$('.quantity_err').attr('class', 'text-danger').html(data.quantity).delay(5000).fadeOut();
}else if (data.failed) {
$('.add-stock').html('<i class="fa fa-plus"></> add stock');
$('.msg').attr('class', 'alert alert-danger').html('<i class="fa fa-times"></> could not procees request...').delay(5000).fadeOut();
}
}
},
error: function () {
$('add-stock').html('<i class="fa fa-plus"></> add stock');
$('.msg').attr('class', 'alert alert-warning').html('<i class="fa fa-warning"></> something went wrong.').delay(5000).fadeOut();
}
})
})
所以,我试图获取选项,以便在 PHP(CodeIgniter)的帮助下将它们存储在单独的行和相应的列中......
到目前为止,这是我的完整控制器
function add_stock()
{
$items = $_POST['item'];
$units = $_POST['unit'];
$quantitys = $_POST['quantity'];
foreach ($items as $item) {
$stock['item'] = $item;
}
foreach ($units as $unit) {
$stock['unit_of_measurement'] = $unit;
}
foreach ($quantitys as $quantity) {
$stock['quantity'] = $quantity;
}
$stock['added_by'] = 'Admin';
$stmt = $this->db->insert('stocks', $stock);
if($stmt):
$array = array('success' => true, 'msg'=>'Item has been successfully added to store');
else:
$array = array('error' => true, 'failed'=>true);
endif;
echo json_encode($array);
}
现在,问题是,不是显示数组的全部内容,而是只输出最后一个内容,即如果 $array 的内容是 ['a','b'],而不是显示 a,b foreach () 循环只显示 b。
但是当我回显 $items、$units 或 $quantitys 本身时,会显示数组的内容。
那么,请问如何获取数组的所有内容并将它们插入不同的行?
谢谢!
解决方案
您的问题从您的表单开始,然后在您的控制器中变得更糟。
您的控制器中的具体问题是:
foreach ($items as $item) {
$stock['item'] = $item;
}
您正在迭代数组,但在每次迭代时都会$items
覆盖 的值。$stock['item']
仅存储最后一个值。
要解决此问题,您需要做很多事情:
首先,在表单名称中使用数组索引。这允许您在收到的数组中提取相应的值$_POST
在您的 HTML 中使用name="item[0]"
, name="unit[0]"
,name="quantity[0]"
在您的<input>
字段中。
然后,在添加新行的 Javascript 代码中,为每个新行增加索引。您已经有一个可以用于此的计数器 = x
。
'<input type="text" name="item[' + x + ']" placeholder="Name of item" class="form-control item" id="item" />'
(我没有复制整行 - 你明白了)
这些更改应该在您的输入中为您提供三个数组,您可以在单个循环中对其进行迭代:
$items = $_POST['item'];
$units = $_POST['unit'];
$qtys = $_POST['quantity'];
for($i=0;$i<count($items); $i++) {
$item = $items[$i];
$unit = $units[$i];
$qty = $qtys[$i];
// Do your database update here with these three variables
}
纯粹主义者会注意到您可以直接使用数组元素。我同意,但这更清楚。
您可以扩展索引以提供二维数组:
name="products[0]['item']"
name="products[0]['unit']"
name="products[0]['quantity']"
x
(以及在 Javascript中使用的相应更改)
然后遍历 $_POST]['products']:
foreach($_POST['products'] as $product) {
$unit = $product['unit'];
...
}
推荐阅读
- php - 如果在第二个数组上找到第一个数组的值,则替换并回显它
- vb.net - 如何生成 Im、Re 倍频程滤波器
- php - 无法请求令牌
- xgboost - xgboost模型的内部节点预测
- firebase - 在颤振应用程序中包含 firebase_storage 的最佳方法是什么?
- kubernetes - 为什么我的 kubernetes webook 只在创建时调用而不在更新时调用?
- c# - 文本框限制值和小数位的简单验证代码是什么?
- testng - 使用 TestNG SoftAssertions 测试通过时如何打印通过消息
- c++ - 在表达式 left() = right() 中,为什么 right() 先排序?
- elasticsearch - 如何在 Elasticsearch 中存储布尔数组并执行 XOR 操作?