Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 27.06.2018 13:36:06

Сравнение массивов в контроллере и передача во view

Здравствуйте, объясните пожалуйста, что я делаю не так.
Мне нужно сравнить 2 массива и получить данные, которых нет во втором массиве.
Воспользовался информацией c форума по ссылке https://php.ru/manual/function.array-diff.html
На моем примере получается следующее:

$arr1 = (array)$systemCentr;
        $arr2 = (array)$mySystemCentr;
        $total = array_diff($arr1, $arr2);

Перед этим я проверил, что

dd($arr1)

выводит

array:2194 [▼
  0 => {#199 ▼
    +"DisplayName0": " Update for Microsoft Office 2007 (KB2508958)"
    +"Publisher0": null
    +"ProdID0": "{########-####-####-####-############}_SharePointDesigner_{########-####-####-####-############}"
  }
  1 => {#201 ▼
    +"DisplayName0": "«Òàêñêîì-Ìàñòåð âûïóñêà ñåðòèôèêàòîâ x86»"
    +"Publisher0": "ÎÎÎ Òàêñêîì"
    +"ProdID0": "{########-####-####-####-############}"

затем проверил

dd($arr2)

и получил

array:2 [▼
  0 => {#2399 ▼
    +"display_name": "ÎÎÎ Òàêñêîì"
    +"product_id": "{########-####-####-####-############}"
    +"publisher": "«Òàêñêîì-Ìàñòåð âûïóñêà ñåðòèôèêàòîâ x86»"
  }
  1 => {#2401 ▼
    +"display_name": "Update for Microsoft Office 2007 (KB2508958)"
    +"product_id": "{########-####-####-####-############}_SharePointDesigner_{########-####-####-####-############}"
    +"publisher": null
  }
]

после проверки применяю

$total = array_diff($arr1, $arr2);

и получаю ошибку -
(1/1)FatalErrorException
Object of class stdClass could not be converted to string -
Объект класса stdClass не может быть преобразован в строку

объясните пожалуйста кто-нибудь из-за чего такое происходит?

Изменено Feonixx_89 (27.06.2018 13:37:38)

Не в сети

#2 27.06.2018 21:23:41

Re: Сравнение массивов в контроллере и передача во view

В доках все написано же про array_diff...

Два элемента считаются одинаковыми тогда и только тогда, если (string) $elem1 === (string) $elem2. Другими словами, когда их строковое представление идентично.

У вас же: $elem1 и $elem2 - объекты. А объекты не могут быть преобразованы в строку.

---

Вам нужно использовать array_udiff. Что-то типа этого должно получиться:

$arr1 = (array)$systemCentr;
$arr2 = (array)$mySystemCentr;

$total = array_udiff($arr1, $arr2,
  function ($obj_a, $obj_b) {
    return strcmp($obj_a->ProdID0, $obj_b->product_id); //У вас текстовые значения, потому используем strcmp
  }
);

P.S. Я не проверял результат, возможно вам придется поискать примеры именно для вашего случая, или сравнивать несколько значений, или поменять аргументы местами smile.
Также strcmp учитывает регистр символов, будьте внимательны.

Изменено FrDR (27.06.2018 21:35:09)

Не в сети

#3 28.06.2018 15:07:25

Re: Сравнение массивов в контроллере и передача во view

Пробовал разными вариантами получаю - Undefined property: stdClass::$product_id

Не в сети

#4 28.06.2018 15:11:01

Re: Сравнение массивов в контроллере и передача во view

вот такой результат получается :

array:2215 [▼
  0 => ExchangeController {#2422 ▼
    #middleware: []
    #validatesRequestErrorBag: null
    +"ProdID": {#2425 …3}
  }
  1 => ExchangeController {#2421 ▼
    #middleware: []
    #validatesRequestErrorBag: null
    +"ProdID": {#2425 …3}
  }
  2 => ExchangeController {#200 ▼
    #middleware: []
    #validatesRequestErrorBag: null
    +"ProdID": {#2425 …3}

если делаю следующее

$arr1 = array();
    foreach($systemCentr as $o){
        $arr1[] = $o->ProdID0;
        };
        
$arr2 = array();
    foreach($mySystemCentr as $v){
        $arr2[] = $v->product_id;
    };
    

$arr_int = array_diff($arr1, $arr2);

$arr_res = array();
    foreach($arr_int as $post){
        $o = new ExchangeController();     
        $o->ProdID=$v;
        $arr_res[]=$o;
    };
dd($arr_res);

Правильно ли это и что мне делать дальше чтобы записать это в БД и вывести на вьюху?

Изменено Feonixx_89 (28.06.2018 15:13:35)

Не в сети

#5 28.06.2018 15:20:04

Re: Сравнение массивов в контроллере и передача во view

$arr_res = array();
    foreach($arr_int as $post){
        $o = new ExchangeController();     
        $o->ProdID=$post; // Внимание на эту строку, тут у вас была ошибка
        $arr_res[]=$o;
    };
dd($arr_res);

А так, не совсем понятно, для чего вам это вообще. Похоже на косяк в архитектуре. Потому совет что с этим вам делать дальше я не дам.

Изменено FrDR (28.06.2018 15:27:13)

Не в сети

#6 28.06.2018 15:55:17

Re: Сравнение массивов в контроллере и передача во view

Большое спасибо за помощь! А по поводу архитектуры обязательно буду переделывать потому, что ощущение, что я нарушил все, что мог у меня самого горит огнем smile

Не в сети

Подвал раздела