Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Здравствуйте, объясните пожалуйста, что я делаю не так.
Мне нужно сравнить 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)
Не в сети
В доках все написано же про 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. Я не проверял результат, возможно вам придется поискать примеры именно для вашего случая, или сравнивать несколько значений, или поменять аргументы местами .
Также strcmp учитывает регистр символов, будьте внимательны.
Изменено FrDR (27.06.2018 21:35:09)
Не в сети
Пробовал разными вариантами получаю - Undefined property: stdClass::$product_id
Не в сети
вот такой результат получается :
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)
Не в сети
$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)
Не в сети
Большое спасибо за помощь! А по поводу архитектуры обязательно буду переделывать потому, что ощущение, что я нарушил все, что мог у меня самого горит огнем
Не в сети