Вы можете filter
массив с закрытием:
var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 } // <= returns [3]
И вы можете подсчитать массив:
filtered.count // <= returns 1
. Таким образом, вы можете определить , если массив включает ваш элемент, объединив их:
myList.filter { $0 == 3 }.count > 0 // <= returns true if the array includes 3
Если вы хотите найти позицию, я не вижу причудливого пути, но вы можете сделать это следующим образом:
var found: Int? // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
if x[i] == 3 {
found = i
}
}
EDIT
Пока мы находимся в этом, для забавного упражнения продолжим Array
, чтобы иметь способ find
:
extension Array {
func find(includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}
Теперь мы можем это сделать:
myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found
Это похоже на проблему от запуска. Любой вид поиска Вас делает потребует сканирования таблицы, и все мы знаем, что это плохо.
Как насчет того, чтобы добавить столбец с хешем текущих номеров телефона после снятия всех символов форматирования. Затем можно, по крайней мере, индексировать значения хэш-функции и избежать полноценного сканирования таблицы.
Или действительно ли объем данных является небольшим и не ожидаемый вырасти очень? Затем, возможно, просто при всасывании всех чисел в клиент и запущении поиска там.
Горе - я. Я закончил тем, что делал это:
mre = mobile_number && ('%' + mobile_number.gsub(/\D/, '').scan(/./m).join('%'))
find(:first, :conditions => ['trim(mobile_phone) like ?', mre])
если это - что-то, что собирается произойти, регулярно, возможно, изменяя данные, чтобы быть всем одним форматом и затем установить поисковую форму для разделения любого неалфавитно-цифрового (если бы Вы позволяете числа как С 310 ЗВОНКАМИ), была бы хорошая идея. Наличие данных в легко искавшем формате является залогом успеха.
Просто идея, но разве Вы не могли использовать Regex, чтобы быстро разделить символы и затем выдержать сравнение с тем как @Matt предложенный Hamilton?
Возможно, даже настройте представление (не уверенный в mysql на представлениях), который содержал бы все номера телефона, разделенные regex к простому номеру телефона?
MySQL может искать на основе регулярных выражений.
Несомненно, но, учитывая произвольное форматирование, если мой стог сена содержится "(027) 123 456"
(примите во внимание, что положение пробелов может измениться, это могло столь же легко быть 027 12 3456
и я хотел соответствовать ему 027123456
, мой regex должен был бы поэтому быть этим?
"^[\D]+0[\D]+2[\D]+7[\D]+1[\D]+2[\D]+3[\D]+4[\D]+5[\D]+6$"
(на самом деле это было бы хуже, поскольку mysql руководство, кажется, не указывает, что поддерживает \D
)
Если это так, разве это не более или менее то же как моя %%%%% идея?
Действительно ли возможно выполнить запрос для переформатирования данных, чтобы соответствовать нужному формату и затем просто выполнить простой запрос? Тот путь, даже если начальное переформатирование является медленным Вы, оно действительно не имеет значения.
Это - проблема с MySQL - функция regex может соответствовать, но это не может заменить. См. это сообщение для возможного решения.
out-of-the-box идея, но Вы могли использовать функцию "замены" для разделения каких-либо экземпляров" (", "-" и "", и затем используют функцию "isnumeric", чтобы протестировать, является ли получившая строка числом?
Затем Вы могли сделать то же к строке номера телефона, которую Вы ищете и сравниваете их как целые числа.
Конечно, это не будет работать на числа как 1800 МАТОВЫХ СКАЛ.:)
Мое решение было бы чем-то вроде того, что сказал John Dyer. Я добавил бы второй столбец (например, phoneStripped), который разделяется на вставке и обновлении. Индексируйте этот столбец и поиск на нем (после разделения Вашего критерия поиска, конечно).
Вы могли также добавить триггер для автоматического обновления столбца, хотя я не работал с триггерами. Но как Вы сказал, действительно трудно написать код MySQL для разделения строк, таким образом, вероятно, легче просто сделать это в клиентском коде.
(Я знаю, что это поздно, но я только что начал смотреть здесь :)
Из perlfaq6 «Как использовать регулярное выражение для удаления комментариев в стиле C из файла?»:
Хотя это действительно можно сделать, это намного сложнее чем вы думаете. Например, этот однострочный
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c
будет работать во многих, но не во всех случаях. Видите ли, это слишком простовато для определенных типов программ на C, в частности, для тех, которые кажутся комментариями в строках в кавычках. Для этого вам понадобится что-то вроде этого, созданное Джеффри Фридлом и позднее измененное Фредом Кертисом.
$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;
Конечно, это можно было бы более разборчиво написать с помощью модификатора / x, добавив пробелы и комментарии. Здесь он расширен, любезно предоставлен Фредом Кертисом.
s{
/\* ## Start of /* ... */ comment
[^*]*\*+ ## Non-* followed by 1-or-more *'s
(
[^/*][^*]*\*+
)* ## 0-or-more things which don't start with /
## but do end with '*'
/ ## End of /* ... */ comment
| ## OR various things which aren't comments:
(
" ## Start of " ... " string
(
\\. ## Escaped char
| ## OR
[^"\\] ## Non "\
)*
" ## End of " ... " string
| ## OR
' ## Start of ' ... ' string
(
\\. ## Escaped char
| ## OR
[^'\\] ## Non '\
)*
' ## End of ' ... ' string
| ## OR
. ## Anything other char
[^/"'\\]* ## Chars which doesn't start a comment, string or escape
)
}{defined $2 ? $2 : ""}gxse;
Небольшая модификация также удаляет комментарии C ++, возможно, занимающие несколько строк с использованием символа продолжения:
См.
http://www.mfs-erp.org/community/blog/find-phone-number-in-database-format-independent
На самом деле это не проблема, что регулярное выражение станет визуально ужасающим, поскольку только mysql "видит" его. Обратите внимание, что вместо '+' (см. Сообщение с [\ D] из OP) вы должны использовать '*' в регулярном выражении.
Некоторых пользователей беспокоит производительность (неиндексированный поиск), но в таблице с 100000 клиентов этот запрос, когда он отправлен из пользовательского интерфейса, возвращается немедленно, без заметной задержки.