Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Существует ли встроенная функция РНР для поиска максимального значения в числовом массиве?
 
 автор: coloboc66   (22.10.2010 в 16:42)   письмо автору
 
 

Что-то не могу найти такую... А если не существует, посоветуйте соответствующий код.
Спасибо.

  Ответить  
 
 автор: Лена   (22.10.2010 в 16:54)   письмо автору
 
   для: coloboc66   (22.10.2010 в 16:42)
 


<?php
$arr 
= array(1,45,3,4,5);
  print 
max($arr);
?>

  Ответить  
 
 автор: sim5   (22.10.2010 в 16:55)   письмо автору
 
   для: coloboc66   (22.10.2010 в 16:42)
 

Существует - max.

  Ответить  
 
 автор: psychomc   (22.10.2010 в 17:31)   письмо автору
 
   для: coloboc66   (22.10.2010 в 16:42)
 

соответствующий код, может пригодится

<?php
$arr 
= array(1,45,3,4,5);
for (
$i 0$i count($arr); $i++) {  
    if (
$i == 0) {
        
$max $arr[$i];
    }  else {
        if (
$max $arr[$i]) {
            
$max $arr[$i];
        }
    } 
}
echo 
$max;
?> 

  Ответить  
 
 автор: sim5   (22.10.2010 в 17:32)   письмо автору
 
   для: psychomc   (22.10.2010 в 17:31)
 

Это зачем такое?

  Ответить  
 
 автор: psychomc   (22.10.2010 в 17:41)   письмо автору
 
   для: sim5   (22.10.2010 в 17:32)
 

какое? поиск максимального элемента в массиве без использования стандартной функции?

  Ответить  
 
 автор: sim5   (22.10.2010 в 17:53)   письмо автору
 
   для: psychomc   (22.10.2010 в 17:41)
 

А стандартная функция с этим не справляется? Да и если самому писать, то тоже можно проще.

  Ответить  
 
 автор: psychomc   (22.10.2010 в 18:21)   письмо автору
 
   для: sim5   (22.10.2010 в 17:53)
 

дело не в том справляется или нет. по содержанию темы показалось, что автору может пригодиться алгоритм.
кстати как сделать проще? интересно.

  Ответить  
 
 автор: Trianon   (22.10.2010 в 18:52)   письмо автору
 
   для: psychomc   (22.10.2010 в 18:21)
 

вытащить один if из-под цикла наружу.

  Ответить  
 
 автор: psychomc   (22.10.2010 в 19:07)   письмо автору
 
   для: Trianon   (22.10.2010 в 18:52)
 

это имеется ввиду?


<?php
$arr 
= array(1,45,3,4,5);
$max $arr[0];
for (
$i 1$i count($arr); $i ++) {
     if (
$max $arr[$i]) $max $arr[$i];
}
echo 
$max;
?>  


да, согласен, так проще будет :)

  Ответить  
 
 автор: Trianon   (22.10.2010 в 20:28)   письмо автору
 
   для: psychomc   (22.10.2010 в 19:07)
 

это.

фигурные скобки там лишние.

  Ответить  
 
 автор: psychomc   (22.10.2010 в 23:14)   письмо автору
 
   для: Trianon   (22.10.2010 в 20:28)
 

перечитал я видимо всяких Макконелов и Совершенных кодов :)
там рекомендуется, насколько я помню, не лениться и ставить фигурные скобки. там мотивировано это тем, что это будет удобно для модификации кода в дальнейшем и повышает читабельность.

  Ответить  
 
 автор: neadekvat   (23.10.2010 в 00:09)   письмо автору
 
   для: psychomc   (22.10.2010 в 23:14)
 

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

Да и без лишних {} реально удобнее код просматривать, когда там всего одна строчка, хотя это все, конечно же, имхо.

  Ответить  
 
 автор: psychomc   (23.10.2010 в 10:56)   письмо автору
 
   для: neadekvat   (23.10.2010 в 00:09)
 

согласен

  Ответить  
 
 автор: Trianon   (23.10.2010 в 10:19)   письмо автору
 
   для: psychomc   (22.10.2010 в 23:14)
 

Я рекомендаций в аналогичном стиле могу написать:
Давайте вместо $a = $b + 10 писать $a = ($b + 10)
А чо? Удобно для модификации кода (вдруг еще что нибудь дописать в выражение понадобится?)
и повышает читабельность :))

  Ответить  
 
 автор: psychomc   (23.10.2010 в 10:55)   письмо автору
 
   для: Trianon   (23.10.2010 в 10:19)
 

пора бы вам сесть за написание книги 8)

  Ответить  
 
 автор: neadekvat   (23.10.2010 в 11:53)   письмо автору
 
   для: psychomc   (23.10.2010 в 10:55)
 

Поддерживаю. Хотя бы какой-нибудь блог с записками программиста и т.д. :) Таких, правда, хватает, но от Trianon'а за 1,5 года я как-то поболее набрался полезных вещей, чем из толстых книжек, где только текст, текст, текст..

  Ответить  
 
 автор: psychomc   (23.10.2010 в 12:32)   письмо автору
 
   для: neadekvat   (23.10.2010 в 11:53)
 

да, я б тоже блог этого господина бы с удовольствием почитал. :)
но кстати книг тоже достаточно классных. пожалуй лучая на мой взгляд (да простит меня софттайм) - М. Зандстра "PHP объекты, шаблоны и методики программирования" 2 издание

  Ответить  
 
 автор: Николай2357   (22.10.2010 в 22:29)   письмо автору
 
   для: psychomc   (22.10.2010 в 19:07)
 

А foreach почему не в чести?
<?php 

$arr 
= array(1,45,3,4,5); 
$max $arr[0];
 
foreach (
$arr as $val)
     if (
$max $val$max $val

echo 
$max;

  Ответить  
 
 автор: psychomc   (22.10.2010 в 23:12)   письмо автору
 
   для: Николай2357   (22.10.2010 в 22:29)
 

по привычке юзаю его в основном для ассоциативных

  Ответить  
 
 автор: psychomc   (23.10.2010 в 11:15)   письмо автору
 
   для: Николай2357   (22.10.2010 в 22:29)
 

в принципе вариант с for здесь все же будет правильнее. т.к элемент с индексом 0 мы в цикле больше не затрагиваем

  Ответить  
 
 автор: neadekvat   (23.10.2010 в 11:54)   письмо автору
 
   для: psychomc   (23.10.2010 в 11:15)
 

У вас еще вычислять размер массива необходимо :)

  Ответить  
 
 автор: psychomc   (23.10.2010 в 12:36)   письмо автору
 
   для: neadekvat   (23.10.2010 в 11:54)
 

ну в этом плане да)
так что все-таки спорно что лучше, хотя микросекунды замерять, как некоторые любят, думаю нет смысла)

зато если у массива фиксированная длина, то лучше все-так for я думаю 8)

  Ответить  
 
 автор: neadekvat   (23.10.2010 в 12:44)   письмо автору
 
   для: psychomc   (23.10.2010 в 12:36)
 

Но самый лучший вариант - использовать стандартную функцию :)

  Ответить  
 
 автор: psychomc   (23.10.2010 в 15:25)   письмо автору
 
   для: neadekvat   (23.10.2010 в 12:44)
 

без б ;)
но не во всех языках такая имеется, насколько я знаю

  Ответить  
 
 автор: sim5   (23.10.2010 в 13:44)   письмо автору
 
   для: psychomc   (23.10.2010 в 11:15)
 

Чем он привлекателен, тем что экономит одну итерацию? Говоря словами Лукашенко, foreach "перетрахивает" массив, а у вас count(array) будет затратная, если массив будет приличным по объему. И довод "фиксированный массив", ниже, несостоятелен. Фиксированный это какой, который маленький размер имеет?

  Ответить  
 
 автор: psychomc   (23.10.2010 в 15:27)   письмо автору
 
   для: sim5   (23.10.2010 в 13:44)
 

неа, в котором фиксированное число элементов, например 5, 100, 1000, не важно....
универсальность конечно теряется.

по поводу foreach да, тем что экономит одну итерацию. экономия сомнительная, но логика неправильная на мой взгляд. впрочем в моем первом примере всё было намного хуже :)

p.s только не надо словами Лу, он мне противен :)

  Ответить  
 
 автор: sim5   (23.10.2010 в 15:32)   письмо автору
 
   для: psychomc   (23.10.2010 в 15:27)
 

Вы думаете, что стоит только знать число элементов массива и count станет работать быстрее? Чтоже вы тогда не пишите сразу нужное? foreach предпочтительней for, ибо ему не надо вычислять по полученному индексу смещение в массиве, дабы получить значение, так как foreach просто сдвигает указатель массива на следующий элемент. То есть работает примерно по такому принципу:
<?
$arr 
= array(15,24,32,1,2,15,9,7);  
$max $arr[0];
while(
next($arr)) if(current($arr) > $max$max current($arr);
echo 
$max;

  Ответить  
 
 автор: psychomc   (23.10.2010 в 16:15)   письмо автору
 
   для: sim5   (23.10.2010 в 15:32)
 

в плане скорости да, судя по всему будет быстрее foreach
про count я вообще ничего не говорил. если мы знаем количество эл-ов в массиве count нам не нужен, напишем просто

<?php
for ($i 1$i 100$i ++)
// ...
?>

  Ответить  
 
 автор: Саня   (23.10.2010 в 16:22)   письмо автору
 
   для: psychomc   (23.10.2010 в 15:27)
 

Недостаток в том, что count() будет вычисляться в начале каждой итерации снова и снова.
Если и делать через for(), то нужно вынести вычисление размера за пределы цикла.

  Ответить  
 
 автор: Trianon   (23.10.2010 в 17:27)   письмо автору
 
   для: Саня   (23.10.2010 в 16:22)
 

собственно, это свойство языка, а не подхода. Достаточно идиотичное, на мой взгляд.

  Ответить  
 
 автор: psychomc   (23.10.2010 в 17:45)   письмо автору
 
   для: Trianon   (23.10.2010 в 17:27)
 

а как себя такой поход ведет в C++ ?

  Ответить  
 
 автор: Trianon   (23.10.2010 в 18:36)   письмо автору
 
   для: psychomc   (23.10.2010 в 17:45)
 

вместо count($arr) Вы там напишете sizeof(arr)/sizeof(arr[0])

  Ответить  
 
 автор: psychomc   (23.10.2010 в 19:03)   письмо автору
 
   для: Trianon   (23.10.2010 в 18:36)
 

не, это я знаю. интересует, если такой же алгоритм с for на C++, где вместо count будет sizeof...будет sizeof каждую итерацию заново высчитываться?

  Ответить  
 
 автор: Саня   (23.10.2010 в 19:09)   письмо автору
 
   для: psychomc   (23.10.2010 в 19:03)
 

Да. Условие перехода всегда исполняется перед началом новой итерации. Если бы условие выполнялось один раз, то получится либо бесконечный, либо неработающий цикл.
Конструкция for ( $i = 0; $i < count($array); $i++ ) настолько часто встречается, что разработчики РНР моглы бы отдельный оптимизационный хак сделать для неё.

  Ответить  
 
 автор: psychomc   (23.10.2010 в 19:17)   письмо автору
 
   для: Саня   (23.10.2010 в 19:09)
 

судя по всему хак это foreach 8)
ну и вынесение из цикла как вы писали, естественно

  Ответить  
 
 автор: sim5   (23.10.2010 в 20:17)   письмо автору
 
   для: psychomc   (23.10.2010 в 19:17)
 

Можете и не выносить:
for ( $i = 0, $k=< count($array); $i < $k; $i++ )

  Ответить  
 
 автор: Trianon   (23.10.2010 в 20:29)   письмо автору
 
   для: sim5   (23.10.2010 в 20:17)
 

Это и есть вынос.
если <= исправить :)

  Ответить  
 
 автор: sim5   (23.10.2010 в 20:35)   письмо автору
 
   для: Trianon   (23.10.2010 в 20:29)
 

Не понял, я же скопированное отредактировал, добавил нужно и убрал лишнее.... неуж-то опять случаной ctrl+v тяпнул....

Я бы это назвал предварительным просчетом в объявлении )

  Ответить  
 
 автор: psychomc   (23.10.2010 в 22:48)   письмо автору
 
   для: sim5   (23.10.2010 в 20:17)
 

это какой-то особый изврат? :)

  Ответить  
 
 автор: sim5   (23.10.2010 в 23:09)   письмо автору
 
   для: psychomc   (23.10.2010 в 22:48)
 

for ( $i = 0, $k=count($array); $i < $k; $i++ )
Что в этом извратного?

  Ответить  
 
 автор: psychomc   (23.10.2010 в 23:39)   письмо автору
 
   для: sim5   (23.10.2010 в 23:09)
 

для это задачи я имел ввиду)

  Ответить  
 
 автор: sim5   (23.10.2010 в 23:41)   письмо автору
 
   для: psychomc   (23.10.2010 в 23:39)
 

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

  Ответить  
 
 автор: Trianon   (23.10.2010 в 19:32)   письмо автору
 
   для: psychomc   (23.10.2010 в 19:03)
 

sizeof(arr)/sizeof(arr[0]) - константное выражение, вычисляется один раз на этапе компиляции - при исполнении в коде сидит уже вычисленное число.

Понятно, что интерпретируемый язык так не объедешь.
Но, блин горелый, зачем для выяснения числа элементов в массиве нужно вызывать явную функцию, с полным чемоданом накладных расходов на создание контекста - мне не понять.
Но мне много чего не понять. Тот же intval() и (int) - те же йайцы.

  Ответить  
 
 автор: psychomc   (23.10.2010 в 22:47)   письмо автору
 
   для: Trianon   (23.10.2010 в 19:32)
 

а мне как раз intval() и (int) понятны...
судя по всему, intval придумали для того, чтобы юзать его как callback для функций типа array_map и т.п или для пользовательских.
хотя, если даже вы не понимаете...может быть я ошибаюсь :)

  Ответить  
 
 автор: Trianon   (23.10.2010 в 23:12)   письмо автору
 
   для: psychomc   (23.10.2010 в 22:47)
 

Собственно array_map и задействует пользовательскую callback .
Ну был бы intval пользовательским - я б не обиделся.
Сам написал - сам понимаешь, что быстро не будет.
Да только в явном вызове-то что мешало inline-оптимизацию реализовать?

  Ответить  
 
 автор: psychomc   (23.10.2010 в 23:37)   письмо автору
 
   для: Trianon   (23.10.2010 в 23:12)
 

если честно то я даже не знаю что это ("inline-оптимизацию") :)

  Ответить  
 
 автор: Trianon   (23.10.2010 в 23:52)   письмо автору
 
   для: psychomc   (23.10.2010 в 23:37)
 

В данном контексте - применительно к php - я имел в виду чтоб запись intval(выражение) исполнялась как ((int)(выражение))

  Ответить  
 
 автор: psychomc   (23.10.2010 в 23:57)   письмо автору
 
   для: Trianon   (23.10.2010 в 23:52)
 

теперь понятно. может быть стоит спросить где-нибудь на просторах php.net :)

  Ответить  
 
 автор: Николай2357   (24.10.2010 в 09:20)   письмо автору
 
   для: psychomc   (23.10.2010 в 23:57)
 

>>может быть стоит спросить где-нибудь на просторах php.net :)
Не надо этого делать. Ибо все в точности до наоборот - просторы должны спрашивать тут :).

А что касается циклов - есть тонкий баланс между скоростью исполнения и читабельностью кода.
В данном случае foreach предпочтительнее из-за последнего, так как искать прироста производительности в таком микроскопическом объеме против читабельности - бред и паранойя.

  Ответить  
 
 автор: psychomc   (24.10.2010 в 11:51)   письмо автору
 
   для: Николай2357   (24.10.2010 в 09:20)
 

согласен по поводу бреда, хотя если вспомнить те же int и intval - в какой-то теме еще раньше писали, что не надо юзать intval, (int) быстрее :)

  Ответить  
 
 автор: Николай2357   (24.10.2010 в 18:30)   письмо автору
 
   для: psychomc   (24.10.2010 в 11:51)
 

(int) не просто быстрее работает. Его и написать быстрее. И прочитать)))
Ровно как и foreach.
Лень - двигатель прогресса. :)

  Ответить  
 
 автор: psychomc   (24.10.2010 в 21:55)   письмо автору
 
   для: Николай2357   (24.10.2010 в 18:30)
 

:)

  Ответить  
 
 автор: sim5   (24.10.2010 в 13:56)   письмо автору
 
   для: Николай2357   (24.10.2010 в 09:20)
 

Хотите сказать, что foreach читается как у "Лукоморья дуб зеленый...", а for, это нечто похожее на сопромат? ;-)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования