Если вы имеете дело с многоиндексным фреймворком данных, вам может быть интересно извлечь только столбец одного имени мультииндекса. Вы можете сделать это как
df.index.get_level_values('name_sub_index')
, и, конечно, name_sub_index
должен быть элементом FrozenList
df.index.names
Это должно быть сделано в php7.
Непроверенный код:
var_export(array_diff_key(array_column($array2, null, 'link_id'), array_column($array1, null, 'link_id'));
Назначьте новые ключи 1-го уровня для обоих массивов, а затем отфильтруйте их.
Проверка по ключам будет более эффективной, чем повторные вызовы из in_array
.
Вы можете сделать это с array-filter . Сначала извлеките все ids
из первого массива, а затем отфильтруйте второй массив на основе этих идентификаторов.
$arr1 = array( (object) ["link_id"=> 35, "key" => "AAA"], (object) ["link_id"=> 373, "key" => "BBB"]);
$arr2 = array( (object) ["link_id"=> 35, "key" => "CCC"], (object) ["link_id"=> 341, "key" => "DDD"]);
$ids = array_column($arr1, "link_id");
$arr2 = array_filter($arr2, function ($e) use ($ids) {
return !in_array($e->link_id, $ids); //keep him in arr2 only if NOT in ids of arr1
});
Обновлен более быстрый ответ Рассмотрим большой объем данных (как для комментария @mickmackusa), используйте это:
$ids = [];
foreach($arr1 as $e)
$ids[$e->link_id] = true;
$arr2 = array_filter($arr2, function ($e) use ($ids) {
return !isset($ids[$e->link_id]);
});
Первое решение в O(n^2)
, а второе находится в O(n)