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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
twelveee
Отправлено: 08 Ноября, 2014 - 20:50:30
Post Id


Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




В общем то в названии и указана проблема)
Нужно проверить, есть ли в массиве (расположенном в другом фале) число больше 0. Хоть одно.

Заранее спасибо)
 
 Top
teddy
Отправлено: 08 Ноября, 2014 - 21:15:12
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




PHP:
скопировать код в буфер обмена
  1. $result = (bool)array_filter($arr, function($val){
  2.     return is_int($val) && $val > 0;
  3. });
  4. var_dump($result);
 
 Top
LIME
Отправлено: 08 Ноября, 2014 - 22:32:29
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)





(Добавление)
ну и если на то пошло то

лишнее

0 приводится к false
я ошибаюсь?
 
 Top
MAXUS
Отправлено: 08 Ноября, 2014 - 23:08:29
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




LIME пишет:
0 приводится к false
я ошибаюсь?


вернет true
(Добавление)
teddy пишет:
PHP:
скопировать код в буфер обмена
  1. $result = (bool)array_filter($arr, function($val){
  2.     return is_int($val) && $val > 0;
  3. });
  4. var_dump($result);


Как ни странно, но я бы решение задачи для больших массивов усложнил. Дело в том, что array_filter пройдет по всему массиву, даже если значение больше 0 находится в первом же элементе. Если массив большой, то это не оптимально. Я бы проходил циклом по принципу, как при поиске обрабатываются индексы в базе данных. Т.е. бьем массив пополам и проходим по первой половине (естественно прерываем работу функции, как только нашли значение больше 0), если в первой половине не нашли, бьем пополам остаток массива и ищем в его первой половине... И так далее, пока весь не разберем. В этом случае вероятность не обрабатывать весь массив гораздо выше.

PHP:
скопировать код в буфер обмена
  1. $array=array(-10,-40,-4,1,-72,-50,-390,-4,-1,-4877,0,0,0,-9,-34,-56,-29,-45,-70);
  2. function find_positive($array){
  3.         if(count($array)==1) return (is_int($array[0]) && $array[0]>0)?true:false;
  4.         for($i=0;$i<ceil(count($array)/2);$i++){
  5.                 //echo $i.' = '.$array[$i].'<br />';
  6.                 if(is_int($array[$i]) && $array[$i]>0) return true;
  7.         }
  8.         return find_positive(array_slice($array,ceil(count($array)/2)));
  9. }
  10. echo (find_positive($array))?'есть':'нет';


Пройдет по циклу до 4-го элемента и прервется. Можно поэкспериментировать, раскомментировав строку в цикле и изменяя начальный массив.

Добавление
Хотя первый вариант, как обычно не самый идеальный. В моем случае происходит разбиение массива при помощи array_slice, то, вероятно, тоже не оптимально. Поэтому переделал так, чтобы массив вообще не преобразовывался.

PHP:
скопировать код в буфер обмена
  1. $array=array(-10,-40,-4,-98,-72,-50,-390,-4,-1,-4877,0,0,0,9,-34,-56,-29,-45,-70);
  2. function find_positive(&$array,$start){
  3.         if($start==count($array)-1) return (is_int($array[$start]) && $array[$start]>0)?true:false;
  4.         for($i=$start;$i<ceil((count($array)+$start)/2);$i++){
  5.                 // echo $i.' = '.$array[$i].'<br />';
  6.                 if(is_int($array[$i]) && $array[$i]>0) return true;
  7.         }
  8.         return find_positive($array,ceil((count($array)+$start)/2));
  9. }
  10. echo (find_positive($array,0))?'есть':'нет';


Кстати, прикольно будет, если кто-то поймет смысл содеяннногоУлыбка

(Отредактировано автором: 09 Ноября, 2014 - 00:08:01)

 
 Top
Мелкий Супермодератор
Отправлено: 09 Ноября, 2014 - 00:07:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MAXUS пишет:
по принципу, как при поиске обрабатываются индексы в базе данных. Т.е. бьем массив пополам

А зачем?
СУБД делают бинарный поиск, потому это и быстро. Бинарный поиск возможен только для отсортированного множества - именно потому это замедляет запись.

Да и суть бинарного поиска немного неверно описана. Мы не разбиваем массив данных сначала, мы выбираем одно значение в середине массива, сравниваем с требуемым - а поскольку массив заведомо упорядочен, то мы точно знаем, в какую половину вообще не имеет смысла заглядывать, там нужных значений заведомо нет. Потом выбираем центральный элемент из половины массива, сравниваем.

Для больших неупорядоченных массивов проще и быстрее:
PHP:
скопировать код в буфер обмена
  1. foreach ($dataset as $i)
  2.     if (is_numeric($i) and $i>0)
  3.         return true;
  4. return false;

Рекурсия ведь штука не бесплатная, даже если копирование массива вместо использования по ссылке в count в последних ветках починили.


-----
PostgreSQL DBA
 
 Top
MAXUS
Отправлено: 09 Ноября, 2014 - 00:13:30
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Мелкий пишет:

Да и суть бинарного поиска немного неверно описана.


Не. Тут я только принцип использовал. Суть (бить пополам) как раз подходит. А вот что быстрее - это вопрос интересный. Рекурсию, в принципе, можно переделать и обойтись без нее. А вот, что быстрее, просто перебор или тот способ, что я указал... Это интересно проверить.

Хотя че там проверять?! Улыбка У меня ровно то же самое и происходитУлыбка Прошли первую половину и пошли дальше по третьей четверти, потом по первой половине четвертой четверти. Короче, просто перебор и получаетсяУлыбка Это я молодецУлыбка Вощем, ты прав. Просто перебора достаточно. И о сути бинарного поиска я, соответственно, тоже воткнул (в смысле, догнал, в смысле осознал)...

Но идея в том, что не надо фильтр. Он пока все не переберет, не успокоится.

Ну и эта... Снимаю шляпу. Приятно, когда не зря мозг включалУлыбка

(Отредактировано автором: 09 Ноября, 2014 - 00:21:41)

 
 Top
LIME2
Отправлено: 09 Ноября, 2014 - 00:26:59
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




офигеть вы тупанули
LIME пишет:
$result = (bool)array_filter($arr);

is int это уже я тупанул
привык к просто (int)
даже не понимаю где надо is_int применять
но главное в моей первой строке
вот вы раздули проблему
элементарно же решается
или я снова не прав?
MAXUS пишет:
Кстати, прикольно будет, если кто-то поймет смысл содеяннного
мелкий вот вроде понял
других извращенцев нет пока))
 
 Top
MAXUS
Отправлено: 09 Ноября, 2014 - 00:31:35
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




LIME2 пишет:
офигеть вы тупанули
$result = (bool)array_filter($arr);


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

PHP:
скопировать код в буфер обмена
  1. $array=array(-10,-40,-4,-98,-72,-50,-390,-4,-1,-4877,0,0,0,-9,-34,-56,-29,-45,-70);
  2. echo (bool)array_filter($array).'<br />';


Напечатает 1.
 
 Top
LIME2
Отправлено: 09 Ноября, 2014 - 00:31:36
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




офигеть столько кода написать вместо 1 фции
(Добавление)
MAXUS пишет:
Напечатает 1.
ичто???
есть же не пустые значения
(Добавление)
возвратит фолс только если пустой массив придет
 
 Top
MAXUS
Отправлено: 09 Ноября, 2014 - 00:37:09
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




LIME2 пишет:
офигеть столько кода написать вместо 1 фции
(Добавление)
MAXUS пишет:
Напечатает 1.
ичто???
есть же не пустые значения
(Добавление)
возвратит фолс только если пустой массив придет


Ты, вероятно, какие-то свои задачи решаешь...
Задача в этой ветке была: "Нужно проверить, есть ли в массиве (расположенном в другом фале) число больше 0. Хоть одно."
 
 Top
LIME2
Отправлено: 09 Ноября, 2014 - 00:44:29
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




только больше?
тогда совсем скучно и элементарно
(Добавление)
MAXUS вот ты меня тоже удивляешь
на толпу ведешься?
или ты сам решил недумать?
 
 Top
LIME
Отправлено: 09 Ноября, 2014 - 02:06:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




twelveee отрицательные числа считаются?
ато тут максик упирается
 
 Top
twelveee
Отправлено: 09 Ноября, 2014 - 12:37:31
Post Id


Гость


Покинул форум
Сообщений всего: 70
Дата рег-ции: Янв. 2013  


Помог: 0 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. foreach ($dataset as $i)
  2.     if (is_numeric($i) and $i>0)
  3.         return true;
  4. return false;


Работает! Спасибо) Тему клоз)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB