【问题标题】:Foreach loop is giving wrong resultsForeach 循环给出错误的结果
【发布时间】:2017-12-22 22:10:17
【问题描述】:

我有两个条件 price_id =2price_id = 1 的表格数据和如下数据。

因此,如果weekday_am 列值为nullempty0.00 price_id =2 我需要在price_id = 1 处取该值,并且相同的逻辑将适用于列@987654331 @,weekend_amweekend_pm。所以我正在做的是我编写了两个具有两个不同条件的查询并使用 foreach 循环检查值。但它给出了错误的结果。

查询代码:

$ArrayTier = BundlePrice::where('bundle_id',$id)->where('price_id','=','2')->get();
             $ArrayDefault = BundlePrice::where('bundle_id',$id)->where('price_id','=','1')->get();
             foreach($ArrayTier as $value)
             {  
                $bundle_id = $value->bundle_id;
                $asset_id = $value->asset_id;

                   foreach($ArrayDefault as $v)
                    {

                        if(!empty($value->weekday_am) || ($value->weekday_am != null))
                        {
                            $weekam =  $value->weekday_am;
                        }else{
                            $weekam = $v->weekday_am;
                        }

                        if(!empty($value->weekday_pm) || ($value->weekday_pm != null))
                        {
                            $weekpm =  $value->weekday_pm;
                        }else{
                            $weekpm = $v->weekday_pm;
                        }

                        if(!empty($value->weekend_am) || ($value->weekend_am != null))
                        {
                            $nonweekam =  $value->weekend_am;
                        }else{
                            $nonweekam = $v->weekend_am;
                        }

                       if(!empty($value->weekend_pm) || ($value->weekend_pm != null))
                        {
                            $nonweekpm =  $value->weekend_pm;
                        }else{
                            $nonweekpm = $v->weekend_pm;
                        }



                    }
                $primaryArray[] = ['asset_id' => $asset_id,'weekam' => $weekam,'weekpm' => $weekpm,'nonweekam' => $nonweekam,'nonweekpm' => $nonweekpm];
             } 

对于上面的查询,我弄错了,因为值没有改变它只取price_id =1的最后一行值

以上代码的结果是:

array:3 [▼
  0 => array:5 [▼
    "asset_id" => 2
    "weekam" => 150.0
    "weekpm" => 320.0
    "nonweekam" => 160.0
    "nonweekpm" => 420.0
  ]
  1 => array:5 [▼
    "asset_id" => 1
    "weekam" => 120.0
    "weekpm" => 180.0
    "nonweekam" => 220.0
    "nonweekpm" => 420.0
  ]
  2 => array:5 [▼
    "asset_id" => 4
    "weekam" => 120.0
    "weekpm" => 320.0
    "nonweekam" => 220.0
    "nonweekpm" => 420.0
  ]
]

如果您看到上面的内容,相同的值会在几个地方重复。 但预期结果应如下所示:

array:3 [▼
  0 => array:5 [▼
    "asset_id" => 2
    "weekam" => 150.0
    "weekpm" => 300.0
    "nonweekam" => 160.0
    "nonweekpm" => 400.0
  ]
  1 => array:5 [▼
    "asset_id" => 1
    "weekam" => 110.0
    "weekpm" => 180.0
    "nonweekam" => 210.0
    "nonweekpm" => 410.0
  ]
  2 => array:5 [▼
    "asset_id" => 4
    "weekam" => 120.0
    "weekpm" => 320.0
    "nonweekam" => 220.0
    "nonweekpm" => 420.0
  ]
]

有人可以帮我解决这个问题吗?或者请建议我任何可以在单个查询中执行此操作而不是通过 foreach 循环的 mysql 查询。谢谢你

【问题讨论】:

  • 我没有得到你的全部代码,但我认为你正在尝试检查 if ( notEmpty And notNULL) 。所以使用&& 运算符而不是|| 运算符
  • 预期与您得到的结果在我看来或多或少相同。我没有看到任何重复值
  • @apokryfos : 请检查两个数组中的 nonweekpm 值,您将了解我要解释的内容

标签: php mysql arrays laravel foreach


【解决方案1】:

您忘记加入资产 ID,因此在循环时会出现乱码。这样做:

$prices = BundlePrice::where('bundle_id',$id)->get()->groupBy("asset_id"); //The group by is done on the collection, not the query: https://laravel.com/docs/5.4/collections#method-groupby
foreach($prices as $bundleprice) {   
    $price = collect($bundleprice)->where("price_id",1)->first();
    $default = collect($bundleprice)->where("price_id",2)->first();
    if (empty($price) && empty($default)) { continue; }
    if (empty($default)) {
        $default = $price;
    }
    $weekam =  !empty($price->weekday_am)?$price->weekday_am:$default->weekday_am;
    $weekpm = !empty($price->weekday_pm)?$price->weekday_pm:$default->weekday_pm;
    $nonweekam = !empty($price->weekend_am)?$price->weekend_am:$default->weekend_am;
    $nonweekpm = !empty($price->weekend_pm)?$price->weekend_pm:$default->weekend_pm;
    $primaryArray[] = ['asset_id' => $default->asset_id,'weekam' => $weekam,'weekpm' => $weekpm,'nonweekam' => $nonweekam,'nonweekpm' => $nonweekpm];        
}

看起来也更干净了。

【讨论】:

    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多