【问题标题】:PHP for each loop returns only last element每个循环的 PHP 只返回最后一个元素
【发布时间】:2017-06-09 09:17:23
【问题描述】:

我正在尝试使用 foreach 保存数组中的数据,但每次只保存数组的最后一个元素。

这是我的代码:

public function demo($cakeId, $percent) {
    $query = $this->dbh->prepare("SELECT price, price * $percent / 100 as dprice FROM prices WHERE cake_id = ? ");
    $query->execute(array($cakeId));

    $prices = $query->fetchAll(\PDO::FETCH_ASSOC);      
    foreach ($prices as $key => $value) {
        $d_amount    = $value['dprice'];
        $price       = $value['price'];
        $final_price = $price - $d_amount;
    }

    $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ? WHERE cake_id = ?");
    $query2->execute(array($final_price,$cakeId));

    $return['data']    = [];
    $return['message'] = "Discount Added";
    $return['msgType'] = true;
    return $return;
}

$prices 是一个包含所有价格的数组,但是当我在循环中使用$prices 时,它只返回最后一个元素。

请帮我解决这个问题。

【问题讨论】:

标签: php arrays loops


【解决方案1】:

我可以从您的代码中看到什么 这不是 PHP 或 Mysql 的问题或错误。你的逻辑问题 即:

foreach ($prices as $key => $value) {
         $xx = $value;

         $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
         $query2->execute(array( $xx)); 
    }

更新语句每次执行并替换表的所有价格。因此,您将获得替换所有先前更新语句的最后更新值

【讨论】:

  • 如果我在循环外编写插入代码,则 $xx 值变为空
  • 你想要什么。向我们展示一个数据库示例
  • 谢谢兄弟..你是对的问题是我的逻辑。终于解决了。
【解决方案2】:

$xx 在任何迭代之前创建并设置为 null。在每次迭代期间,如果将被覆盖。在离开你的脚本、函数、方法的范围之前,它不会被销毁……

$xx;
foreach ($prices as $key => $value) {
         $xx = $value;
         $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
         $query2->execute(array( $xx)); 
    }

【讨论】:

    【解决方案3】:

    变量$xx = $value;应该在foreach之外声明..

    在您的代码中,变量 $xx = $value; 在第一次迭代期间创建,然后在每次进一步迭代时被覆盖。

    应该是这样的:

       $xx = $value;
      foreach ($prices as $key => $value) {   
    
    
             $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
             $query2->execute(array( $xx));    
    
    
    
        }
    

    【讨论】:

      【解决方案4】:

      对于在循环内声明的 php 变量,您必须检查此 Are PHP variables declared inside a foreach loop destroyed and re-created at each iteration? 以了解您的问题。

      还有一件事你应该在循环之前检查你的数组not empty

      你必须为你的更新查询添加条件,检查一些对 mysql 的好东西:

      $xx; 
      if(!empty($prices)){
      foreach ($prices as $key => $value) {
               $xx = $value;
               $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
               $query2->execute(array( $xx)); 
          }
      }
      

      【讨论】:

      • 声明它,但最后一个元素仍在保存
      【解决方案5】:

      我猜你能做的就是使用 $key

      $key 是 $prices 数组中数组值的索引

      foreach ($prices as $key => $value) {
               $query2 = $this->dbh->prepare("UPDATE prices SET discount_price = ?");
               $query2->execute(array($value[$key])); 
          }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多