Как получить общие значения из 2 коллекций Laravel - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть 2 Коллекции в Laravel, и я хочу только общие значения в моем $result объекте. Я вижу, что $collection->intersect() работает только для 1D массива. Ниже представлены коллекции

Collection {#1086 ▼
  #items: array:5 [▼
    0 => {#1115 ▼
      +"name": "Light"
      +"class": "ABC"
      +"id": 4
    }
    1 => {#1113 ▼
      +"name": "Milo"
      +"class": "XYZ"
      +"id": 10
    }
    2 => {#1120 ▼
      +"name": "Milo Test"
      +"class": "ABC"
      +"id": 12
    }
    3 => {#1102 ▼
      +"name": "KMSMiloCow"
      +"class": "ABC"
      +"id": 16
    }
    4 => {#1106 ▼
      +"name": "MiloCows"
      +"class": "XYZ"
      +"id": 18
    }
  ]
}

Collection {#1086 ▼
      #items: array:5 [▼
        0 => {#1115 ▼
          +"name": "Light"
          +"class_name": "ABC"
          +"id": 4
        }           
      ]
    }

Теперь в моем результате мне просто нужно это

Collection {#1086 ▼
          #items: array:5 [▼
            0 => {#1115 ▼
              +"name": "Light"
              +"class": "ABC"
              +"id": 4
            }           
          ]
        }

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

попробуйте

 $a1 = array(
           array('name' => 'asdfjkl;', 'class' => 'foo'),
           array('name' => 'qwerty', 'class' => 'bar'),
           array('name' => 'uiop', 'class' => 'baz'),
        );
$a2 = array(
           array('name' => 'asdfjklk;', 'class' => 'foo'),
           array('name' => 'qwertyxs', 'class' => 'bar'),
           array('name' => 'uiop', 'class' => 'baz'),
        );
$cc = array_uintersect($a1, $a2, 'cmp');
print_r($cc);

function cmp($a1, $a2){
   return strcasecmp($a1['name'] , $a2['name']);
}
0 голосов
/ 19 апреля 2019

Я думаю, используя метод сбора each и contains, это можно сделать так

    $collection1->each(function ($value, $key) use ($collection2){
        return $collection2->contains($value);
    });
    dd($collection1);

Я проверяю его в файле маршрутов web.php, например

use Illuminate\Support\Collection;
Route::get('test', function(){
    $collection1 = new Collection([
        'bear',
        'whale',
        'chicken',
        'tardigrade'
    ], [[
        'bear8',
        'whale44',
        'chicken45',
        'tardigrade445'
    ]]);
    $collection2 = new Collection([
        'bear1',
        'whale2',
        'chicken3',
        'tardigrade4'
    ], [[
        'bear',
        'whale',
        'chicken',
        'tardigrade'
    ]]);
    $collection1->each(function ($value, $key) use ($collection2){
        return $collection2->contains($value);
    });
    dd($collection1);
});
...