powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Поиск по массиву
25 сообщений из 31, страница 1 из 2
Поиск по массиву
    #37740859
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ассоциированый массив $arr 6000 элементов.
Есть строка $str
Необходимо осущиствить поиск вложения по массиву этой строки $str, т.е. пример
Код: php
1.
2.
3.
4.
5.
6.
$str = 'check';
$arr =array(
'a' => 'check', //вернет ее
'b' => '123check123', //и ее
'c' => '123' // не вернет
);


обычный array_search ее не находит, так как он ищет строго равенство, как можно реализовать максимально быстро онное?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37740863
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже задача выглядит так:
есть массив из строк, надо найти в другом массиве вложение из любого элемента данного массива, т.е.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$find = array(
'test1',
'find2'
);
$arr = array(
'a' => '123test1', // вернет
'b' => 'find2123', // вернет
'c' => 123 // Не вернет
);
...
Рейтинг: 0 / 0
Поиск по массиву
    #37740884
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отсортировать и потом перебирать?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37740885
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а хотя с учетом того, что любое вхождение, тогда так или иначе придется проверять каждую строку...
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741149
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,

Для первой задачи решение есть такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
$arr = array(
    'a' => 'check', 
    'b' => '123check123', 
    'c' => '123' 
); 
$str = 'check'; 
$filtered_arr = array_filter($arr, function ($element) use ($str) { return (false !== strpos($element, $str)); } ); 

print_r($filtered_arr);


Для второй что-то типа тоже можно придумать :)
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741414
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторstrpos($element, $str)
несработает для utf-8
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741472
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и че?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741502
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowавторstrpos($element, $str)
несработает для utf-8
данные все в cp1251
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741513
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже если были бы в другой кодировке, заменить функцию поиска подстроки не проблема
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741537
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
ScareCrowавторstrpos($element, $str)
несработает для utf-8Да с чего это не стработает?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741696
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На латинице может и сработает, на кириллице - нет
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741867
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или да?)
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741943
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettНа латинице может и сработает, на кириллице - нет
Значения все в латинице, мне нужен имено алгоритм максимально быстрого поиска (как я понимаю используя встреоные функции по раьботе с массивами). Оыбчный цикл в цикле есть пол секунды, что очень долго. Арау фильтер тоже есть больше чем обычный пробег по массиву
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741957
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот массив откуда берется?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741960
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там видимо не сам цикл жрет время, а именно функция strpos
...
Рейтинг: 0 / 0
Поиск по массиву
    #37741969
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серилизовать и регексом вытащить, по скорости не знаю как это будет
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742063
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_mdсерилизовать и регексом вытащить, по скорости не знаю как это будет
Береться от функции get_defined_constants(true)['user'], если сериализовать - то как быть с цифрами: s:14:"asdasd" указывающие на длину строки? Мне необходимо заменить одно значение на другое, длина строки увеличиться, и десирилизация не сработает. Да и превратить 6000 элементов в строки, кажадя коснтанта в районе 200 символов, получим строку в районе милиона символов, и копаться в ней будет накладней чем просто пробежаться по массиву
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742100
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,
• Мне необходимо заменить одно значение на другое
изначально об этом не было и слова,
Может просто define переделать, на то они и дефайны чтоб их не изменять :)
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742113
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmeL_md,

нет, переделка контант происходит после загрузки всех констант, да еще и по ходу выполнения заменять надо не одну сотню раз.
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742153
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор если сериализовать - то как быть с цифрами: s:14:"asdasd" указывающие на длину строки

json_encode
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742532
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.... если в проекте используется БД - может положить туда, и не мучится? использовать тупо оператор like .... код короткий, решение - масштабируемое. глупый возможно вопрос - а откуда этот ассоциированный массив берется изначально, и куда кладется потом? Иногда решение частной задачи лучше искать зная общий контекст. "Быстро" - насколько? в смысле - если супероптимизировать работу со строками в этом участке кода, а рядом будет жрать процессорное время фреймворк, работающий поверх тормозной БД - выигрышь никто не заметит ....
может оно и извлекается из базы? ну не в коде же 6000 констант прописаны?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742550
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого обсуждение =)))

А как же http://www.php.net/manual/en/function.preg-grep.php ?

P.S.: Для задачи поиска нескольких значений сразу можно array('test1', 'find2') слить в регулярку /test1|find2/
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742554
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovБД - может положить туда, и не мучится?
Ну это уже как раз мучаться. Вот если бы какая-то агрегация нужна была - другое дело.
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742806
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,

Ну, например, мой вариант, пробежавшись по массиву из 6000 произвольных 32-символьных хэшей, нашел 140 элементов, в которых встретились 3-хбуквенные сочетания из массива размером 4 элемента за 0.078 сек
А вот 40000 элементов уже обрабатывал 0.527 сек.
Вроде бы вполне адекватное время.
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742816
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с preg_grep сравни
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Поиск по массиву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]