За последние 24 часа нас посетил 15201 программист и 1391 робот. Сейчас ищут 822 программиста ...

Сравнение массивов

Тема в разделе "PHP для новичков", создана пользователем Feonix89, 27 июн 2018.

  1. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Здравствуйте, объясните пожалуйста, что я делаю не так.
    Мне нужно сравнить 2 массива и получить данные, которых нет во втором массиве.
    Воспользовался информацией c форума по ссылке https://php.ru/manual/function.array-diff.html
    На моем примере получается следующее:
    Код (Text):
    1. $arr1 = (array)$systemCentr;
    2.         $arr2 = (array)$mySystemCentr;
    3.         $total = array_diff($arr1, $arr2);
    Перед этим я проверил, что
    Код (Text):
    1. dd($arr1)
    выводит
    Код (Text):
    1. array:2194 [▼
    2.   0 => {#199 ▼
    3.     +"DisplayName0": " Update for Microsoft Office 2007 (KB2508958)"
    4.     +"Publisher0": null
    5.     +"ProdID0": "{########-####-####-####-############}_SharePointDesigner_{########-####-####-####-############}"
    6.   }
    7.   1 => {#201 ▼
    8.     +"DisplayName0": "«Òàêñêîì-Ìàñòåð âûïóñêà ñåðòèôèêàòîâ x86»"
    9.     +"Publisher0": "ÎÎÎ Òàêñêîì"
    10.     +"ProdID0": "{########-####-####-####-############}"
    затем проверил
    Код (Text):
    1. dd($arr2)
    и получил
    Код (Text):
    1. array:2 [▼
    2.   0 => {#2399 ▼
    3.     +"display_name": "ÎÎÎ Òàêñêîì"
    4.     +"product_id": "{########-####-####-####-############}"
    5.     +"publisher": "«Òàêñêîì-Ìàñòåð âûïóñêà ñåðòèôèêàòîâ x86»"
    6.   }
    7.   1 => {#2401 ▼
    8.     +"display_name": "Update for Microsoft Office 2007 (KB2508958)"
    9.     +"product_id": "{########-####-####-####-############}_SharePointDesigner_{########-####-####-####-############}"
    10.     +"publisher": null
    11.   }
    12. ]
    после проверки применяю
    Код (Text):
    1. $total = array_diff($arr1, $arr2);
    и получаю ошибку -
    (1/1)FatalErrorException
    Object of class stdClass could not be converted to string -
    Объект класса stdClass не может быть преобразован в строку

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

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Начинаю понимать, что получаю массив с объектами. Соответственно они и не сравниваются. Но отсюда вопрос как можно сравнить массив объектов с массивом объектов и получить отсутствующие значения?
     
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  4. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Я совсем не понимаю :(
    точно не понимаю зачем рандом и два пустых массива.
    PHP:
    1. <?php
    2. class A {
    3.   public $f = null;
    4.  
    5.   public function __construct(){
    6.       $this->f = mt_rand(1,10);
    7.   }
    8.  
    9.   public function __toString(){
    10.       return (string) $this->f;
    11.   }
    12. };
    13.  
    14. $objectsA = [];
    15. $objectsB = [];
    16.  
    17. for($i=0; $i<11; $i++){
    18.     $obj = new A();
    19.     if($i%2){
    20.         $objectsA[] = $obj;
    21.     }else{
    22.         $objectsB[] = $obj;
    23.     }
    24. }
    25.  
    26. //var_dump($objectsA, $objectsB);
    27.  
    28. var_dump(array_diff($objectsA, $objectsB));
    попробовал привести к строке

    PHP:
    1. $myText1 = (string)$mySystemCentr;
    2. $myText2 = (string)$SystemCentr
    3.  
    4. $res = array_diff($objectsA, $objectsB));
    получил ошибку Array to string conversion
    --- Добавлено ---
    нашел, что можно сделать так:
    PHP:
    1. $arr1 = array();
    2. foreach($arr_source_1 as $o){
    3. $arr1[] = $o->login
    4. }
    аналогично со вторым

    и после этого так:
    PHP:
    1. $arr_int = array_diff($arr1, $arr2);
    2. $arr_res = array();
    3. foreach($arr_int as $v){
    4. $o = new stdClass();
    5. $0->login=$v;
    6. $arr_res[]=$o
    но почему то вызывает сомнения
     
  5. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Примитивный вариант сравнения
    PHP:
    1. foreach($array1 as $value1) {
    2.  foreach($array2 as $value2) {
    3.    if( $value1->login==$value2->login) echo "совпадение";
    4.  }
    5. }
     
    TeslaFeo нравится это.
  6. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Решено. Вдруг кому-нибудь пригодится. Получилось сделать вот таким образом:
    PHP:
    1. $arr1 = array();
    2.     foreach($systemCentr as $o){
    3.         $arr1[] = $o->ProdID0;
    4.         };
    5.      
    6. $arr2 = array();
    7.     foreach($mySystemCentr as $v){
    8.         $arr2[] = $v->product_id;
    9.     };
    10.  
    11. $arr_int = array_diff($arr1, $arr2);
    12.     $arr_res = array();
    13.     foreach($arr_int as $post){
    14.         $o = new ExchangeController();  
    15.         $o->ProdID=$post;
    16.         $arr_res[]=$o;
    17.     };
    18. dd($arr_res);
     
    TeslaFeo нравится это.