Tammam
Tammam

Reputation: 438

How To Merge Collection Relation Array and Make it unique?

I Have 2 Collections, The first collection comes from a query with a where condition, while the second collection comes from all items. I intend to merge the two collections, but between the first array and the second array there are the same items. How do i make the items unique when they are merged?

Here is first array,

[
    {
        "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"
                }
            }
        ]
    }
]

And here is the second array

[
    {
        "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"
                }
            }
        ]
    }
]

And here is my code :

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']];

    }

In the first array there are brand_items with the names "ALPUKAT" and "GULA AREN", and the same items are also in the second array. How can I make the items in the first array not show up again in the second array? I have tried combining two arrays, but still the items are still not unique.

Upvotes: 0

Views: 179

Answers (3)

dale landry
dale landry

Reputation: 8610

Use in_array() to find like values in the two arrays. Then find out what the key value of the second arrays duplicates are using array_search(). Unset the duplicates using a foreach loop.

I use two defined arrays of colors in my example

Note the two like variables purple and blue

$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]);            
    }
}

Now merge the two arrays together into one new array using array_merge(): By leaving the first array alone the original value that was duplicated in the second value is defined in the array, just the second value has been removed

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

var_dump($all_colors);

Original variables:

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

Note the key values are indeed different

By defining a new variable $key and assigning the variables that were in_array() within the foreach() loop we can now unset those different keyed variables from our second array, $two.

Results:

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" 
}

No duplicates now. Do what you wish with this new cleansed variable.

Bonus:

Wrap this all up in a function.

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;
}

use function evalArrays($somearray, $anotherarray);

Upvotes: 1

Helioarch
Helioarch

Reputation: 1188

Going by the code you provided, I am going to assume that $data1 and $data2 is a laravel collection class instead of an array, then you can try the following code before your query of 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();

Upvotes: 1

user3585659
user3585659

Reputation: 89

You can hash each row by

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

Then store the hashed row into a new column.

Upvotes: -1

Related Questions