Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск значения в массиве 
V
    Опции темы
Gold Dragon
Дата 18.6.2012, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Что-то мозги кипят и ни как не могу сообразить как реализовать... попробую объяснить задачу..

есть массив со значениями следующей структуры
[string][-][int][-][int][-][string]
Пример
array('asd_qwe-1-0-qwe', 'qw_we-0-0-fr-ds', 'as_df-2-3-qwe')

Строки начинаются с буквы, но могут содержать и цифры и тире

Условия такие
1. Точное совпадение если нет в нуля
2. если есть ноль, то в значение может быть любым, по типу *


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
bars80080
Дата 18.6.2012, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Код

$search = 'some';
$arr = array('asd_qwe-1-0-qwe', 'qw_we-0-0-fr-ds', 'as_df-2-3-qwe');

$ret = array();

foreach($arr as $key => $v) {
    $pos = strpos($v, '0');
    if($pos !== false || $v == $search) { $ret[] = $key; }
}

PM MAIL WWW   Вверх
Gold Dragon
Дата 19.6.2012, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



немного не так объяснил наверное..
значения для поиска могут быть такие же как и то что ищут, вернее имеют тот же формат (состоят из 4 блока разделённых 'тире')

где ищем -> что ищем
'asd_qwe-1-0-qwe' -> 'asd_qwe-1-0-'
'qw_we-0-0-fr-ds' -> qw_we-0-0-fr-ds'
'as_df-2-3-qwe' -> 'as_df-2-0-qwe'


Думаю поиск должен быть регуляркой что-то типа
Код

#^([a-z0-9_-])+-(\d)+-(\d)+-([a-z0-9_-])+$#i


Это сообщение отредактировал(а) Gold Dragon - 19.6.2012, 07:15


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 19.6.2012, 09:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



а вопрос то в чем?
PM MAIL   Вверх
Gold Dragon
Дата 19.6.2012, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



есть таблица с данными, в т.ч. и с тем что искать.
Есть массив в котором есть данные которые уже указывал.

Необходимо листать данные полученные из таблицы и проверять одно поле на совпадение его в массиве

Идеальным вариантом было бы найти в массиве значение используя регулярку.. Но что-то такой простой функции типа in_array() нет (или я не знаю). Вот нужно придумать что-то своё и чтобы скорость не съедало


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 19.6.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



т.е. поиск в базе? ну так строишь регулярку, соответствующую всем шаблонам из массива используя mysql regexp
PM MAIL   Вверх
Gold Dragon
Дата 19.6.2012, 10:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Цитата(baldina @  19.6.2012,  11:40 Найти цитируемый пост)
т.е. поиск в базе? 
нет же

1. есть массив
Код

$arr = array('asd_qwe-1-0-qwe', 'qw_we-0-0-fr-ds', 'as_df-2-3-qwe');


2. есть данные из базы.

3. Есть цикл
Код

foreach($rows as $row){}

в котором получаются данные, а так же формируется строка проверки в формате, в котором есть  в массиве

4. в цикле необходимо проверять данные из массива и сформированное значение.

5. Пример.
- в массиве есть значение "com-qwer-5-0-"
- сформировалось - "com-qwer-5-2-asd"

6. значения состоят из 4-х частей всегда, разделённое тире А-Б-В-Г
А - латиница, подчёркивание, тире, цифры
Б - только цифры
В - только цифры
Г - латиница, подчёркивание, тире, цифры, может быть пустым

7. Из примера. 
- В массиве 
  А = com-qwer
  Б = 5
  В = 0
  Г = 
- В сформированном 
  А = com-qwer
  Б = 5
  В = 2
  Г = asd

Если в массиве в Б или В ноль, то в сформированном значение игнорируется и при сравнении всегда ИСТИНА
Если в массиве в Г "", то в сформированном значение игнорируется и при сравнении всегда ИСТИНА

В примере значения "равны"

вот в этом примере ЛОЖ
- в массиве есть значение "com-qwer-5-2-"
- сформировалось - "com-qwer-5-0-asd"




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 19.6.2012, 13:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(Gold Dragon @  19.6.2012,  10:57 Найти цитируемый пост)
- в массиве есть значение "com-qwer-5-0-"
- сформировалось - "com-qwer-5-2-asd"

по какому правилу сформировалось? (учитывая что $arr = array('asd_qwe-1-0-qwe', 'qw_we-0-0-fr-ds', 'as_df-2-3-qwe');)
PM MAIL   Вверх
Gold Dragon
Дата 19.6.2012, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



да я уже объяснял же(!) ну куда подробнее?? не важно как они формируются, важно что они имеют вот такое значение
Цитата(Gold Dragon @  19.6.2012,  11:57 Найти цитируемый пост)
6. значения состоят из 4-х частей всегда, разделённое тире А-Б-В-Г
А - латиница, подчёркивание, тире, цифры
Б - только цифры
В - только цифры
Г - латиница, подчёркивание, тире, цифры, может быть пустым



Вот регулярка для расклада
Код

#^([a-z0-9_-]+)-(\d+)-(\d+)-([a-z0-9_-]*)$#i



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Aliance
Дата 19.6.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



А что если разбить строку через explode и проверить 1 и 2 элементы на равенство нулю?
PM MAIL WWW ICQ Skype   Вверх
Gold Dragon
Дата 19.6.2012, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



explode не получится, только регуляркой. Тире может быть и в первом и в последнем блоке, кроме разделителей

Добавлено через 57 секунд
а накидал один способ, у меня работает. Упростил как мог, но всё равно сложный получился.. сейчас выдерну из скрипта и выложу


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 20.6.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(Gold Dragon @  19.6.2012,  10:57 Найти цитируемый пост)
Если в массиве в Б или В ноль, то в сформированном значение игнорируется и при сравнении всегда ИСТИНА
Если в массиве в Г "", то в сформированном значение игнорируется и при сравнении всегда ИСТИНА

Это жесть smile

Зачем нужна строка, которая не строка, а структура?
Для чего себе создавать геморрой?



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 20.6.2012, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Fortop, если нет решения, то философия мне не нужна(!) без обид. Возьми любой серийный номер любой техники - это строка, которая и есть зашифрованная структура. 
Я имею набор таких "серийников" и у меня есть с чем их сравнивать. Так вот мне нужно или каждое значение из "справочника" приводить в структуру и сравнивать или структуру привести в строку и сравнить.. Второй вариант намного энергоёмкостнее  


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Fortop
Дата 20.6.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(Gold Dragon @  20.6.2012,  12:13 Найти цитируемый пост)
то философия мне не нужна

Это не философия.
Философия у вас в постановке задачи.
Сравнить жопу с пальцем наиболее эффективным способом - это не задача.

И решения нет по той причине, что нет проблемы. Какая конечная цель?
Найти серийник?
Или найти ряд серийников? Если ряд серийников, то по каким критериям? По маске? Какие правила формирования маски?

Вам задали вполне правильный вопрос
Цитата(baldina @  19.6.2012,  13:17 Найти цитируемый пост)
по какому правилу сформировалось?

Потому что это влияет на то, как решать задачу.

Добавлено через 5 минут и 8 секунд
Цитата(Gold Dragon @  20.6.2012,  12:13 Найти цитируемый пост)
 у меня есть с чем их сравнивать

Кстати, с чем все же сравниваются серийники?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 20.6.2012, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Цитата(Fortop @  20.6.2012,  14:54 Найти цитируемый пост)
И решения нет по той причине, что нет проблемы. Какая конечная цель?
Найти серийник?
Или найти ряд серийников? Если ряд серийников, то по каким критериям? По маске? Какие правила формирования маски?

А прочитать то что я уже написал выше не судьба? Или там так очень кратко написано? особенно тут?
http://forum.vingrad.ru/index.php?showtopi...t&p=2498560

Что за трёп? только слова и ничего больше, ни вопроса ни ответа, только эмоциональные жаргонизмы. Читай лучше мои пояснения. если не понятно задавай вопросы. Уже несколько раз сказал и про маску и про то какие данные, и с примерами, и с чем сравнивать

Добавлено через 9 минут и 39 секунд
вот рабочий код. Код выдернут из движка. Упростил как смог

сам метод
Код

    public static function MenuLinksSelect($arr, $selected){
        $html = '<select name="selections[]" class="inputbox" size="26" multiple="multiple">';
        foreach($arr as $key){
            $select = '';
            if($key->value !== -999){
                if($key->value === '')$key->value = '-0-0-';
                if($key->value == '0')$key->value = '0-0-0-';
                $tmp = preg_match("#^([a-z0-9_-]*)-(\d+)-(\d+)-([a-z0-9_-]*)$#i", $key->value, $arr_sel);
                foreach($selected as $sel){
                    if($tmp){
                        if($sel['option'] == ''){
                            $select = ' selected="selected"';
                        } else{
                            $error = 0;
                            if($arr_sel[1] == $sel['option'] or $sel['option'] == '') $error++;
                            if($arr_sel[2] == $sel['directory'] or $sel['directory'] == '0') $error++;
                            if($arr_sel[3] == $sel['category'] or  $sel['category'] == '0') $error++;
                            if($arr_sel[4] == $sel['task'] or $sel['task'] == '') $error++;
                            if($error == 4) $select = ' selected="selected"';
                        }
                    }
                }
            }
            $html .= '<option value="' . $key->value . '" ' . $select . '>' . $key->text . '</option>';
        }
        $html .= '</select>';
        return $html;
    }



Значение $arr
Код

array(26) {
  [0]=>
  object(stdClass)#149 (2) {
    ["value"]=>
    string(0) ""
    ["text"]=>
    string(6) "Все"
  }
  [1]=>
  object(stdClass)#150 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [2]=>
  object(stdClass)#151 (2) {
    ["value"]=>
    int(0)
    ["text"]=>
    string(22) "Отсутствуют"
  }
  [3]=>
  object(stdClass)#152 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [4]=>
  object(stdClass)#153 (2) {
    ["value"]=>
    string(18) "com_frontpage-0-0-"
    ["text"]=>
    string(31) "Главная страница"
  }
  [5]=>
  object(stdClass)#154 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [6]=>
  object(stdClass)#155 (2) {
    ["value"]=>
    string(13) "com_boss-6-6-"
    ["text"]=>
    string(46) "Файловый архив : Анектоды"
  }
  [7]=>
  object(stdClass)#156 (2) {
    ["value"]=>
    string(13) "com_boss-6-8-"
    ["text"]=>
    string(54) "Файловый архив : Фотозаставки"
  }
  [8]=>
  object(stdClass)#157 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [9]=>
  object(stdClass)#158 (2) {
    ["value"]=>
    string(13) "com_boss-5-1-"
    ["text"]=>
    string(33) "Основной : Новости"
  }
  [10]=>
  object(stdClass)#159 (2) {
    ["value"]=>
    string(13) "com_boss-5-2-"
    ["text"]=>
    string(31) "Основной : Статьи"
  }
  [11]=>
  object(stdClass)#160 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [12]=>
  object(stdClass)#161 (2) {
    ["value"]=>
    string(13) "com_boss-7-4-"
    ["text"]=>
    string(39) "Контакты : Мультгерои"
  }
  [13]=>
  object(stdClass)#162 (2) {
    ["value"]=>
    string(13) "com_boss-7-5-"
    ["text"]=>
    string(55) "Контакты :   - Иностранные"
  }
  [14]=>
  object(stdClass)#163 (2) {
    ["value"]=>
    string(13) "com_boss-7-6-"
    ["text"]=>
    string(53) "Контакты :   - Российские"
  }
  [15]=>
  object(stdClass)#164 (2) {
    ["value"]=>
    string(13) "com_boss-7-7-"
    ["text"]=>
    string(39) "Контакты : Президенты"
  }
  [16]=>
  object(stdClass)#165 (2) {
    ["value"]=>
    string(13) "com_boss-7-8-"
    ["text"]=>
    string(31) "Контакты : Учёные"
  }
  [17]=>
  object(stdClass)#166 (2) {
    ["value"]=>
    int(-999)
    ["text"]=>
    string(12) "------------"
  }
  [18]=>
  object(stdClass)#167 (2) {
    ["value"]=>
    string(16) "com_banners-0-0-"
    ["text"]=>
    string(14) "Баннеры"
  }
  [19]=>
  object(stdClass)#168 (2) {
    ["value"]=>
    string(13) "com_poll-0-0-"
    ["text"]=>
    string(12) "Опросы"
  }
  [20]=>
  object(stdClass)#169 (2) {
    ["value"]=>
    string(14) "com_login-0-0-"
    ["text"]=>
    string(22) "Авторизация"
  }
  [21]=>
  object(stdClass)#170 (2) {
    ["value"]=>
    string(15) "com_search-0-0-"
    ["text"]=>
    string(10) "Поиск"
  }
  [22]=>
  object(stdClass)#171 (2) {
    ["value"]=>
    string(18) "com_syndicate-0-0-"
    ["text"]=>
    string(18) "RSS экспорт"
  }
  [23]=>
  object(stdClass)#172 (2) {
    ["value"]=>
    string(17) "com_massmail-0-0-"
    ["text"]=>
    string(27) "Рассылка почты"
  }
  [24]=>
  object(stdClass)#173 (2) {
    ["value"]=>
    string(13) "com_xmap-0-0-"
    ["text"]=>
    string(21) "Карта сайта"
  }
  [25]=>
  object(stdClass)#174 (2) {
    ["value"]=>
    string(14) "com_elrte-0-0-"
    ["text"]=>
    string(16) "elFinder + elRTE"
  }
}

Значение $selected
Код

array(2) {
  [0]=>
  array(4) {
    ["option"]=>
    string(13) "com_frontpage"
    ["directory"]=>
    string(1) "0"
    ["category"]=>
    string(1) "0"
    ["task"]=>
    string(0) ""
  }
  [1]=>
  array(4) {
    ["option"]=>
    string(8) "com_boss"
    ["directory"]=>
    string(1) "5"
    ["category"]=>
    string(1) "0"
    ["task"]=>
    string(0) ""
  }
}




--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.