【问题标题】:How To Merge Collection Relation Array and Make it unique?如何合并集合关系数组并使其唯一?
【发布时间】:2020-03-10 02:17:19
【问题描述】:

我有 2 个集合,第一个集合来自带有 where 条件的查询,而第二个集合来自所有项目。我打算合并这两个集合,但是在第一个数组和第二个数组之间有相同的项目。合并后如何使项目独一无二?

这是第一个数组,

[
    {
        "id": 71,
        "id_brand": 1,
        "id_brand_outlet": 14,
        "id_user": 5,
        "id_brand_outlet_tujuan": 15,
        "alasan": "Try",
        "no_surat": "JJ-00001-1",
        "created_at": "2020-03-10 08:57:00",
        "updated_at": "2020-03-10 08:57:00",
        "type": "Delivery Out",
        "category": "ITEM MASUK",
        "brand_items": [
            {
                "id": 1,
                "id_brand": 1,
                "id_brand_delivery": 71,
                "id_brand_item": 1,
                "id_unit": 2,
                "qty_before": 10,
                "qty_change": 10,
                "qty_after": 0,
                "created_at": "2020-03-10 08:57:00",
                "updated_at": "2020-03-10 08:57:00",
                "name": "ALPUKAT",
                "id_unit_opname": 2,
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 8,
                "id_brand": 1,
                "id_brand_delivery": 71,
                "id_brand_item": 8,
                "id_unit": 2,
                "qty_before": 10,
                "qty_change": 10,
                "qty_after": 0,
                "created_at": "2020-03-10 08:57:00",
                "updated_at": "2020-03-10 08:57:00",
                "name": "GULA AREN",
                "id_unit_opname": 2,
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            }
        ]
    }
]

这是第二个数组

[
    {
        "id": 1,
        "id_owner": 3,
        "name": "Janji Jiwa",
        "slug": "JJ",
        "logo": "images/brand/4041569999956.png",
        "created_at": null,
        "updated_at": "2020-03-05 16:02:11",
        "category": "ITEM LAINNYA",
        "brand_items": [
            {
                "id": 1,
                "id_brand": 1,
                "id_brand_category": 1,
                "name": "ALPUKAT",
                "accurate_name": "ALPUKAT",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 25000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": "2",
                "created_at": "2020-02-25 09:32:46",
                "updated_at": "2020-02-25 09:32:46",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 3,
                "id_brand": 1,
                "id_brand_category": 8,
                "name": "CHOCOLATE",
                "accurate_name": "CHOCOLATE",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 25000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": null,
                "created_at": "2020-02-25 09:32:47",
                "updated_at": "2020-02-25 09:32:47",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 8,
                "id_brand": 1,
                "id_brand_category": 9,
                "name": "GULA AREN",
                "accurate_name": "GULA AREN",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 12000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": null,
                "created_at": "2020-02-25 09:32:48",
                "updated_at": "2020-02-25 09:32:48",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 9,
                "id_brand": 1,
                "id_brand_category": 12,
                "name": "PLASTIC CUP 14 OZ",
                "accurate_name": "PLASTIC CUP 14 OZ",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 17000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": null,
                "created_at": "2020-02-25 09:32:48",
                "updated_at": "2020-02-25 09:32:48",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 11,
                "id_brand": 1,
                "id_brand_category": 8,
                "name": "ROTI TAWAR",
                "accurate_name": "ROTI TAWAR",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 25000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": null,
                "created_at": "2020-02-25 09:32:48",
                "updated_at": "2020-02-25 09:32:48",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            },
            {
                "id": 14,
                "id_brand": 1,
                "id_brand_category": 13,
                "name": "TISSUE GULUNG",
                "accurate_name": "TISSUE GULUNG",
                "po_name": null,
                "id_unit_order": 2,
                "id_unit_opname": 2,
                "id_unit2_order": null,
                "id_unit2_opname": null,
                "low_stock_limit": 0,
                "price": 17000,
                "minimum_order": 1,
                "image": null,
                "is_inventory": 1,
                "is_ongkos_kirim": 0,
                "limit": null,
                "created_at": "2020-02-25 09:32:48",
                "updated_at": "2020-02-25 09:32:48",
                "unit_opname": {
                    "id": 2,
                    "name": "Pcs",
                    "created_at": "2019-09-19 00:00:00",
                    "updated_at": "2019-09-19 00:00:00"
                }
            }
        ]
    }
]

这是我的代码:

public function deliveryIn(Request $request){
        $post = $request->all();


        $data1 = BrandOutletDelivery::where('no_surat', 'LIKE' ,'%'.$post['no_surat'])->where('type', 'Delivery Out')->whereDate('created_at', date("Y-m-d"))->with('brandOutletDeliveryItems.unit')->get();

        if(count($data1) > 0){
            $data1[0]['category']="ITEM MASUK"; //add key & value to the array
            foreach($data1 as $key => $value){
                foreach ($value['brandOutletDeliveryItems'] as $key1 => $val) {


                    $value['brandOutletDeliveryItems'][$key1]['name'] = $val['brandItem']['name'];
                    $value['brandOutletDeliveryItems'][$key1]['id'] = $val['brandItem']['id'];
                    $value['brandOutletDeliveryItems'][$key1]['id_unit_opname'] = $val['brandItem']['id_unit_opname'];

                    $val['unit_opname'] = $val['unit'];

                    unset($val['unit']);
                    unset($val['brandItem']);
                    // $data2 = $data2->get();
                }

                $value['brand_items'] = $value['brandOutletDeliveryItems'];
                   unset($data1[$key]['brandOutletDeliveryItems']);

            }

        }

        $data2 = Brand::where('id', $post['id_brand']);
        $data2->with(['brandItems' => function($q){
            $q->where('is_inventory', 1)->with('unitOpname');
        }]);
        $data2 = $data2->get();

        // }

        $data2[0]['category']="ITEM LAINNYA"; //add key & value to the array


        $data = $data1->merge($data2);


        return response(MyHelper::checkGet($data));


        return ['status' => 'fail', 'messages' => ['Nomor Surat Tidak Ditemukan']];

    }

在第一个数组中有brand_items,名称为“ALPUKAT”和“GULA AREN”,第二个数组中也有相同的项目。如何使第一个数组中的项目不再出现在第二个数组中? 我尝试过组合两个数组,但这些项目仍然不是唯一的。

【问题讨论】:

  • 使用in_array() 编写一个函数,首先它遍历第一个数组来标识每个值,然后遍历第二个数组并比较删除双倍项的值。最后用删除的项目创建一个新数组。

标签: php arrays laravel eloquent


【解决方案1】:

按照您提供的代码,我将假设$data1$data2 是一个laravel 集合类而不是一个数组,那么您可以在查询data2 之前尝试以下代码。

// get the id of all the brand item of the first array
$brandIdArr = $data1->pluck('brand_items')->flatten()->pluck('id')->all();

// then filter them out on your eager loading query
$data2 = Brand::where('id', $post['id_brand']);
$data2->with(['brandItems' => function($q)use($brandIdArr){ // added use
    $q->where('is_inventory', 1)->whereNotIn('id',$brandIdArr)->with('unitOpname'); // added whereNotIn
}]);
$data2 = $data2->get();

【讨论】:

    【解决方案2】:

    使用in_array() 在两个数组中查找相似的值。然后找出第二个数组重复的键值使用array_search()。使用 foreach 循环取消设置重复项。

    我在示例中使用了两个已定义的颜色数组

    注意两个类似的变量purpleblue

    $one = array(
        "green" , "red" , "brown", "purple", "blue", "limegreen"
    );
    $two = array(
        "yellow" , "orange" , "purple", "blue", "skyblue"
    );
    
    
    
    foreach($one as $key => $color){
        if(in_array($color, $two)){            
            $key = array_search($color, $two);
                unset($two[$key]);            
        }
    }
    

    现在使用array_merge() 将两个数组合并为一个新数组: 通过保留第一个数组,在数组中定义了在第二个值中重复的原始值,仅删除了第二个值

    $all_colors = array_merge($one, $two);
    
    var_dump($all_colors);
    

    原始变量:

    $one = array(
        "green" , "red" , "brown", "purple", "blue", "limegreen"
    );
    $two = array(
        "yellow" , "orange" , "purple", "blue", "skyblue"
    );
    

    注意键值确实不同

    通过定义一个新变量 $key 并在 foreach() 循环中分配 in_array() 的变量,我们现在可以从第二个数组 $two 中取消设置这些不同的键变量。

    结果:

    array(9) { 
        [0]=> string(5) "green" 
        [1]=> string(3) "red" 
        [2]=> string(5) "brown" 
        [3]=> string(6) "purple" 
        [4]=> string(4) "blue" 
        [5]=> string(9) "limegreen" 
        [6]=> string(6) "yellow" 
        [7]=> string(6) "orange" 
        [8]=> string(7) "skyblue" 
    }
    

    现在没有重复。用这个新的清理变量做你想做的事。

    奖金:

    将这一切封装在一个函数中。

    function evalArrays($first_array, $second_array){
        foreach($first_array as $k => $value){
            if(in_array($value, $second_array)){            
                $keyvalues_to_remove = array_search($value, $second_array);
                    unset($second_array[$keyvalues_to_remove]);            
            }
        }
        $new_array = array_merge($first_array, $second_array);
        return $new_array;
    }
    

    使用函数evalArrays($somearray, $anotherarray);

    【讨论】:

    • in "if(in_array($value, $second_array))" 错误 "in_array() 期望参数 2 是数组,文件中给出的对象"。我尝试 $data->toArray();但是当我再次尝试时,它不会输入“if(in_array($value, $second_array))”。
    • Tammam,我很抱歉,因为我没有注意到您在问题中标记了 larvel。我组合两个数组并删除重复项的方法不能解决您的问题。不幸的是,我没有使用 Larvel 的经验。但是,您是否尝试过将对象类型转换为数组? $array = (array) $yourObject;此链接可能会有所帮助:ocramius.github.io/blog/fast-php-object-to-array-conversion
    【解决方案3】:

    您可以通过

    对每一行进行哈希处理

    $hashedArrayRow = md5(serialize($arrayRow));

    然后将散列后的行存储到一个新列中。

    【讨论】:

    • 这可能是因为它出现时没有双重项目吗?
    • 您可以比较哈希值是否相同它们是重复的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2020-06-28
    • 1970-01-01
    • 2021-10-12
    • 2021-03-29
    相关资源
    最近更新 更多