Как объединить коллекцию Relay Array и сделать ее уникальной? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть 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", и те же элементы находятся также во втором массиве. Как я могу сделать так, чтобы элементы в первом массиве больше не появлялись во втором массиве? Я попытался объединить два массива, но все же элементы не являются уникальными.

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Используйте in_array(), чтобы найти одинаковые значения в двух массивах. Затем выясните, какое значение ключа дубликатов второго массива использует array_search(). Удалите дубликаты, используя foreach l oop.

Я использую два определенных массива цветов в моем примере

Обратите внимание на две одинаковые переменные purple и 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]);            
    }
}

Теперь объедините два массива в один новый массив, используя 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 и назначив переменные, которые были in_array() в пределах foreach() l oop, мы теперь можем сбросить эти различные переменные с ключами из нашего второго массива $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" 
}

Дубликатов сейчас нет. Сделайте то, что вы sh с этой новой очищенной переменной.

Бонус:

Оберните все это в функцию.

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

1 голос
/ 10 марта 2020

Исходя из предоставленного вами кода, я предполагаю, что $data1 и $data2 - это класс сбора laravel вместо массива, тогда вы можете попробовать следующий код перед запросом данных2.

// 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();
0 голосов
/ 10 марта 2020

Вы можете иметь sh каждую строку с помощью

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

Затем сохраните хешированную строку в новом столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...