powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Поиск по массиву
31 сообщений из 31, показаны все 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
Поиск по массиву
    #37742833
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov.... если в проекте используется БД - может положить туда, и не мучится? использовать тупо оператор like .... код короткий, решение - масштабируемое. глупый возможно вопрос - а откуда этот ассоциированный массив берется изначально, и куда кладется потом? Иногда решение частной задачи лучше искать зная общий контекст. "Быстро" - насколько? в смысле - если супероптимизировать работу со строками в этом участке кода, а рядом будет жрать процессорное время фреймворк, работающий поверх тормозной БД - выигрышь никто не заметит ....
может оно и извлекается из базы? ну не в коде же 6000 констант прописаны?
Все контанты прописаны в коде.
Беруться я уже писал от get_defined_constants(true)['user']. Цель: в них встречаются определенные имена таблиц вида: ххххх.yyyyyy , надо заменить на ххххххх.zzzzzzz.
Засунуть все в базу, потом лайком пройтись, и потом удалить все? Не накладно ли будет?
...
Рейтинг: 0 / 0
Поиск по массиву
    #37742836
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
preg_grep в понедельник првоерю
...
Рейтинг: 0 / 0
Поиск по массиву
    #37743407
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ренат,
Опишите тогда задачу целиком может идея с массивом вообще можно забыть.
Как я понимаю у Вас проблема в том что нужно изменять имена таблиц, возможно даже не имена а только схемы, тогда это можно решить одним запросом к базе установив схему по умолчанию на уровне сессии. Возможно есть смысл создать представления,либо просто создать таблицу соответствий schema1.table1 => schema2.table2
Как по мне то тут нужно решать не проблему 6000 массива, а то что приводит к нему.
...
Рейтинг: 0 / 0
Поиск по массиву
    #37743417
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там 6000 таблиц? о_О
...
Рейтинг: 0 / 0
Поиск по массиву
    #37744683
Фотография Ренат
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettТам 6000 таблиц? о_О
таблиц несколько тысяч, но это не принципиально
SmeL_mdРенат,
Опишите тогда задачу целиком может идея с массивом вообще можно забыть.
Как я понимаю у Вас проблема в том что нужно изменять имена таблиц, возможно даже не имена а только схемы, тогда это можно решить одним запросом к базе установив схему по умолчанию на уровне сессии. Возможно есть смысл создать представления,либо просто создать таблицу соответствий schema1.table1 => schema2.table2
Как по мне то тут нужно решать не проблему 6000 массива, а то что приводит к нему.
Можно поподробней насчет схем?
Представления отпадают ввиду того что данные беруться из коснтант а не выборке из базы
...
Рейтинг: 0 / 0
Поиск по массиву
    #37744746
Фотография SmeL_md
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РенатМожно поподробней насчет схем?
Представления отпадают ввиду того что данные беруться из коснтант а не выборке из базыНе знаю какой СУБД Вы пользуетесь, особо внятно не написано на WIKI но ключевые там слова. Она может включать другие объекты
Представте что в вашей базе n количество баз, поидеи так у вас и есть если Вы написали ххххх.yyyyyy , надо заменить на ххххххх.zzzzzzz где ххххх и ххххххх это различные схемы
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Поиск по массиву
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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