PHP foreach() 只输出数组的最后一项

Posted

技术标签:

【中文标题】PHP foreach() 只输出数组的最后一项【英文标题】:PHP foreach() outputs only the last item of an array 【发布时间】:2021-05-06 01:31:23 【问题描述】:

作为我上一篇文章的续集,我的目的只是让我的问题直截了当且简短,但显然,为了清楚起见,最好包括所有涉及的模块。

我正在开发一个 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 本身时,会显示数组的内容。

那么,请问,如何获取数组的所有内容并将它们插入到不同的行中?

谢谢!

【问题讨论】:

【参考方案1】:

您的问题从您的表单开始,然后在您的控制器中变得更糟。

您的控制器中的具体问题是:

foreach ($items as $item) 
   $stock['item'] = $item;

您正在迭代 $items 数组,但在每次迭代时都会覆盖 $stock['item'] 的值。只存储最后一个值。

要解决此问题,您需要做很多事情:

首先,在表单名称中使用数组索引。这允许您在$_POST 中收到的数组中提取相应的值

在您的 HTML 中,在您的 &lt;input&gt; 字段中使用 name="item[0]"name="unit[0]"name="quantity[0]"

然后,在添加新行的 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']"

(以及在 Javascript 中使用 x的相应更改)

然后遍历 $_POST]['products']:

foreach($_POST['products'] as $product) 
     $unit = $product['unit'];
     ...

【讨论】:

以上是关于PHP foreach() 只输出数组的最后一项的主要内容,如果未能解决你的问题,请参考以下文章

php foreach输出数组只输出元素的第一个字符

php Foreach:检查它是否是最后一项

为啥我的委托只使用我的 foreach 循环中的最后一项?

在 foreach 循环中使用 file_put_contents 只会下载最后一项

PDO - foreach 只更新最后一个

PHP 为除最后一项以外的每一项添加逗号