在集合中删除键值对的第二个实例

时间:2018-07-11 16:28:29

标签: php laravel laravel-5 collections

因此,我试图确定某个应用程序是否属于受下游服务影响的应用程序列表的一部分。以下代码是我当前正在尝试执行的操作:

  private function createAppArray($apps, $downApps){

        $final = collect([]);
        for($i = 0; $i < count($apps); $i++){
            foreach($downApps as $downApp){
                if($apps[$i]->id == $downApp->aid){
                    $test = collect($apps[$i]);
                    $final->push($test->merge(['status' => 'warning']));
                    $i++;
                } 
            }
        }


        if($final->count() < count($apps)){
            foreach($apps as $app){
                $test = collect($app);
                $final->push($test->merge(['status' => 'success']));
            }
            // dd($final);
        }


        return $final;
    }

从下面的截图中可以看出,由于我将$apps的内容附加到了具有受影响应用程序的最终集合中,因此该应用程序上下复制了该应用程序。

enter image description here

dd($final)的内容也随附:

enter image description here

基本上,我需要做的是删除此集合中重复的应用程序的第二个实例。

因此,如果id是第二次出现,然后删除该集合,有人可以帮我完成我似乎无法弄清楚的那件事吗?

1 个答案:

答案 0 :(得分:1)

除了创建2个单独的循环并尝试合并结果外,您还可以通过遍历整个应用程序列表( $ apps )并查看是否减少代码来减少大量代码该ID存在于 $ downApps 集合中。

private function createAppArray($apps, $downApps) {
    $final = collect([]);
    foreach($apps as $app){

        $test = collect($app);

        // check to see if the down apps collection as this app
        if (!$downApps->where('aid', $app->id)->isEmpty()){
            $final->push($test->merge(['status' => 'warning']));
        } else {
            $final->push($test->merge(['status' => 'success']));
        }
    }

    return $final;
}

此方法使逻辑更易于阅读。