@kyja

Какой есть быстрый способ сравнить многомерный массив?

Подскажите пожалуйста какой есть самый быстрый способ сравнить два массива

--$arr1----
array(3) {
  [0]=>
  array(2) {
    ["url"]=>
    string(36) "/1/1/1"
    ["cnt"]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    ["url"]=>
    string(31) "/2/2/2"
    ["cnt"]=>
    string(1) "1"
  }
 [2]=>
  array(2) {
    ["url"]=>
    string(31) "/3/3/3"
    ["cnt"]=>
    string(1) "1"
  }
}


--$arr2----
array(2) {
  [0]=>
  array(2) {
    ["url"]=>
    string(36) "/1/1/1"
    ["cnt"]=>
    string(1) "1"
  }
  [1]=>
  array(2) {
    ["url"]=>
    string(31) "/2/2/2"
    ["cnt"]=>
    string(1) "1"
  }
}


Сейчас я использую такой вариант
Иду по второму массиву и если во втором массиве есть значение которого нету в первом то выполняю действие
foreach ($arr2 as $arr2s) {
    $key = null;
    $key = array_search( $arr2s['url'] , array_column($arr1, 'url'));  
    //Если не нашел будет действие
    if ( $key == false) {
    var_dump ($arr2s);
    }
}


Проблема в том что в массиве 4 000 000 значений и это занимает очень много времени, подскажите пожалуйста более быстрый способ
  • Вопрос задан
  • 156 просмотров
Решения вопроса 2
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Как минимум вынесите из цикла array_column($arr1, 'url')
$url1arr = array_column($arr1, 'url');

foreach ($arr2 as $arr2s) {
    $key = null;
    $key = array_search( $arr2s['url'] , $url1arr );  
    //Если не нашел будет действие
    if ( $key == false) {
    var_dump ($arr2s);
    }
}


а лучше так:
$url1arr = array_column($arr1, 'url', 'url');

foreach ($arr2 as $arr2s) {
    //Если не нашел будет действие
    if (!isset($url1arr[$arr2s['url']])) {
    	var_dump ($arr2s);
    }
}


PHP editor online
Ответ написан
toxa82
@toxa82
Если url уникальный то его можно вынести в ключ массива, и дальше использовать array_diff_key или array_intersect_key
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Vitsliputsli
Если весь массив умещается в память это уже хорошо. Как оптимизировать:
1) Создайте массивы не ассоциативные, а с обычными числовыми ключами. Лучше так и хранить, будет отдельно массив url и массив cnt, связь по числовому ключу.
2) Храните отсортированный массив, и используйте по нему, например, бинарный поиск.
3) Дополнительно можно использовать массив фиксированной длины из SPL, а не стандартный на хеш-таблицах, на таких объемах от него будет толк.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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