2014-02-11 3 views
0

Я ищу код, который обрабатывает около 7 тыс. Элементов в CSV. Импортер CSV проверяет дубликаты, и часть этого процесса предназначена для каждой строки, которая проверяет все остальные строки, которые были обработаны для дубликатов. Это означает, что он делает что-то вроде ...strtolower (trim()) == strtolower (trim()) медленный

foreach ($users as $possibleDuplicate) { 
    if (strtolower(trim($user->first_name)) == strtolower(trim($possibleDuplicate->first_name)) && strtolower(trim($user->last_name)) == strtolower(trim($possibleDuplicate->last_name))) { 

    } 
} 

игнорировать ужасные исполнения идеи положить на место по этому сценарию (я не писал). Кажется, что strtolower(trim()) производит довольно сильный удар по моему импорту. Я искал гораздо более эффективную и быструю замену. Я еще не провел никаких тестов производительности, но планирую завтра. Я надеялся, что кто-то здесь сможет пролить свет на некоторую информацию, которую они уже имеют о методах, которые могут быть быстрее, например preg_match().

Обновление: Я не хочу увеличивать производительность этого цикла, я признаю, что методы перемещения вне диапазона foreach значительно улучшат производительность.

+6

Я могу вам сказать, что регулярное выражение, безусловно, будет медленнее, чем 'strtolower' – Machavity

+2

Возможно использовать [' strcasecmp'] (http://php.net/manual/en/function .strcasecmp.php) (сравнение строк без учета регистра)? –

+1

Вы используете их несколько раз через эти функции? Если это так, вы можете обрабатывать их все и хранить на карте, а затем извлекать оттуда или делать это лениво, пока не найдете значения, не существующие на карте. – alex

ответ

2

Вы должны перемещать детали, которые не изменяются вне цикла:

и, возможно, поставить last_name тест перед испытанием на первое имя (потерпеть неудачу быстрее, если каждый имеет имя «Джон», однако все может есть «McGuire», как фамилия)

$userFirstNameLower = strtolower(trim($user->first_name)); 
$userLastNameLower = strtolower(trim($user->last_name)); 
foreach ($users as $possibleDuplicate) { 
    if ($userLastNameLower == strtolower(trim($possibleDuplicate->last_name)) && $userFirstNameLower == strtolower(trim($possibleDuplicate->first_name))) { 

    } 
} 
Смежные вопросы