Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Проверка, есть ли в массиве число > 0
Как ни странно, но я бы решение задачи для больших массивов усложнил. Дело в том, что array_filter пройдет по всему массиву, даже если значение больше 0 находится в первом же элементе. Если массив большой, то это не оптимально. Я бы проходил циклом по принципу, как при поиске обрабатываются индексы в базе данных. Т.е. бьем массив пополам и проходим по первой половине (естественно прерываем работу функции, как только нашли значение больше 0), если в первой половине не нашли, бьем пополам остаток массива и ищем в его первой половине... И так далее, пока весь не разберем. В этом случае вероятность не обрабатывать весь массив гораздо выше.
Пройдет по циклу до 4-го элемента и прервется. Можно поэкспериментировать, раскомментировав строку в цикле и изменяя начальный массив.
Добавление
Хотя первый вариант, как обычно не самый идеальный. В моем случае происходит разбиение массива при помощи array_slice, то, вероятно, тоже не оптимально. Поэтому переделал так, чтобы массив вообще не преобразовывался.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
MAXUS пишет:
по принципу, как при поиске обрабатываются индексы в базе данных. Т.е. бьем массив пополам
А зачем?
СУБД делают бинарный поиск, потому это и быстро. Бинарный поиск возможен только для отсортированного множества - именно потому это замедляет запись.
Да и суть бинарного поиска немного неверно описана. Мы не разбиваем массив данных сначала, мы выбираем одно значение в середине массива, сравниваем с требуемым - а поскольку массив заведомо упорядочен, то мы точно знаем, в какую половину вообще не имеет смысла заглядывать, там нужных значений заведомо нет. Потом выбираем центральный элемент из половины массива, сравниваем.
Для больших неупорядоченных массивов проще и быстрее:
Рекурсия ведь штука не бесплатная, даже если копирование массива вместо использования по ссылке в count в последних ветках починили.
----- PostgreSQL DBA
MAXUS
Отправлено: 09 Ноября, 2014 - 00:13:30
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Мелкий пишет:
Да и суть бинарного поиска немного неверно описана.
Не. Тут я только принцип использовал. Суть (бить пополам) как раз подходит. А вот что быстрее - это вопрос интересный. Рекурсию, в принципе, можно переделать и обойтись без нее. А вот, что быстрее, просто перебор или тот способ, что я указал... Это интересно проверить.
Хотя че там проверять?! У меня ровно то же самое и происходит Прошли первую половину и пошли дальше по третьей четверти, потом по первой половине четвертой четверти. Короче, просто перебор и получается Это я молодец Вощем, ты прав. Просто перебора достаточно. И о сути бинарного поиска я, соответственно, тоже воткнул (в смысле, догнал, в смысле осознал)...
Но идея в том, что не надо фильтр. Он пока все не переберет, не успокоится.
Ну и эта... Снимаю шляпу. Приятно, когда не зря мозг включал
Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
офигеть вы тупанули
LIME пишет:
$result = (bool)array_filter($arr);
is int это уже я тупанул
привык к просто (int)
даже не понимаю где надо is_int применять
но главное в моей первой строке
вот вы раздули проблему
элементарно же решается
или я снова не прав?
MAXUS пишет:
Кстати, прикольно будет, если кто-то поймет смысл содеяннного
мелкий вот вроде понял
других извращенцев нет пока))
MAXUS
Отправлено: 09 Ноября, 2014 - 00:31:35
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
LIME2 пишет:
офигеть вы тупанули
$result = (bool)array_filter($arr);
Я бы тебе посоветовал проверять свой код, прежде чем его публиковать.
Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
офигеть столько кода написать вместо 1 фции (Добавление)
MAXUS пишет:
Напечатает 1.
ичто???
есть же не пустые значения (Добавление)
возвратит фолс только если пустой массив придет
MAXUS
Отправлено: 09 Ноября, 2014 - 00:37:09
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
LIME2 пишет:
офигеть столько кода написать вместо 1 фции (Добавление)
MAXUS пишет:
Напечатает 1.
ичто???
есть же не пустые значения (Добавление)
возвратит фолс только если пустой массив придет
Ты, вероятно, какие-то свои задачи решаешь...
Задача в этой ветке была: "Нужно проверить, есть ли в массиве (расположенном в другом фале) число больше 0. Хоть одно."
LIME2
Отправлено: 09 Ноября, 2014 - 00:44:29
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014
Помог: 0 раз(а)
только больше?
тогда совсем скучно и элементарно (Добавление) MAXUS вот ты меня тоже удивляешь
на толпу ведешься?
или ты сам решил недумать?
LIME
Отправлено: 09 Ноября, 2014 - 02:06:23
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
twelveee отрицательные числа считаются?
ато тут максик упирается
twelveee
Отправлено: 09 Ноября, 2014 - 12:37:31
Гость
Покинул форум
Сообщений всего: 70
Дата рег-ции: Янв. 2013
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.