Каков наиболее эффективный способ удалить все элементы одного массива из другого массива? - PullRequest
8 голосов
/ 29 ноября 2010

У меня есть два массива, массив A содержит длинный список с некоторыми элементами, которые я хочу удалить.Массив B - это полный список тех элементов, которые я хочу удалить из массива A.

Какой самый эффективный способ добиться этого?

Ответы [ 3 ]

12 голосов
/ 29 ноября 2010

array_diff - очевидный ответ, но, поскольку вы попросили самый эффективный способ, вот тест

$big = range(1, 90000);
$remove = range(500, 600);

$ts = microtime(true);
$result = array_diff($big, $remove);
printf("%.2f\n", microtime(true) - $ts);

$ts = microtime(true);
$map = array_flip($remove);
$result = array();
foreach($big as $e)
    if(!isset($map[$e]))
        $result[] = $e;
printf("%.2f\n", microtime(true) - $ts);

отпечатки на моей машине

0.67
0.03

Таким образом, простой цикл с поиском на основе хеша примерно в 20 раз быстрее, чем array_diff.

12 голосов
/ 29 ноября 2010

Использовать array_diff ()

6 голосов
/ 29 ноября 2010

В руководстве это дает для array_dif () этот пример:

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>

Выходы:

Array
(
    [1] => blue
)

Возвращает массив, содержащий все записи из array1, которых нет ни в одном из других массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...