Как удалить значение массива из массива, если значение не совпадает с обоих значений [дубликата]

Если вы имеете дело с многоиндексным фреймворком данных, вам может быть интересно извлечь только столбец одного имени мультииндекса. Вы можете сделать это как

df.index.get_level_values('name_sub_index')

, и, конечно, name_sub_index должен быть элементом FrozenList df.index.names

0
задан Umar Abdullah 17 January 2019 в 06:02
поделиться

2 ответа

Это должно быть сделано в php7.

Непроверенный код:

var_export(array_diff_key(array_column($array2, null, 'link_id'), array_column($array1, null, 'link_id'));

Назначьте новые ключи 1-го уровня для обоих массивов, а затем отфильтруйте их.

Проверка по ключам будет более эффективной, чем повторные вызовы из in_array.

0
ответ дан mickmackusa 17 January 2019 в 06:02
поделиться

Вы можете сделать это с 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)

0
ответ дан dWinder 17 January 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: