|
|
|
| Что-то не могу найти такую... А если не существует, посоветуйте соответствующий код.
Спасибо. | |
|
|
|
|
|
|
|
для: coloboc66
(22.10.2010 в 16:42)
| |
<?php
$arr = array(1,45,3,4,5);
print max($arr);
?>
|
| |
|
|
|
|
|
|
|
для: coloboc66
(22.10.2010 в 16:42)
| | Существует - max. | |
|
|
|
|
|
|
|
для: 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;
?>
|
| |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 17:31)
| | Это зачем такое? | |
|
|
|
|
|
|
|
для: sim5
(22.10.2010 в 17:32)
| | какое? поиск максимального элемента в массиве без использования стандартной функции? | |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 17:41)
| | А стандартная функция с этим не справляется? Да и если самому писать, то тоже можно проще. | |
|
|
|
|
|
|
|
для: sim5
(22.10.2010 в 17:53)
| | дело не в том справляется или нет. по содержанию темы показалось, что автору может пригодиться алгоритм.
кстати как сделать проще? интересно. | |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 18:21)
| | вытащить один if из-под цикла наружу. | |
|
|
|
|
|
|
|
для: 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;
?>
|
да, согласен, так проще будет :) | |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 19:07)
| | это.
фигурные скобки там лишние. | |
|
|
|
|
|
|
|
для: Trianon
(22.10.2010 в 20:28)
| | перечитал я видимо всяких Макконелов и Совершенных кодов :)
там рекомендуется, насколько я помню, не лениться и ставить фигурные скобки. там мотивировано это тем, что это будет удобно для модификации кода в дальнейшем и повышает читабельность. | |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 23:14)
| | Есть такое дело, тоже помню эту рекомендацию.
Однако за примерно полгода, которые я не ставлю лишних скобок, забыл их поставть при добавлении кода всего пару-тройку раз - в редакторе достаточно четко видно, хотя у самых новичков, наверное, могут быть трудности.
Да и без лишних {} реально удобнее код просматривать, когда там всего одна строчка, хотя это все, конечно же, имхо. | |
|
|
|
|
|
|
|
для: neadekvat
(23.10.2010 в 00:09)
| | согласен | |
|
|
|
|
|
|
|
для: psychomc
(22.10.2010 в 23:14)
| | Я рекомендаций в аналогичном стиле могу написать:
Давайте вместо $a = $b + 10 писать $a = ($b + 10)
А чо? Удобно для модификации кода (вдруг еще что нибудь дописать в выражение понадобится?)
и повышает читабельность :)) | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 10:19)
| | пора бы вам сесть за написание книги 8) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 10:55)
| | Поддерживаю. Хотя бы какой-нибудь блог с записками программиста и т.д. :) Таких, правда, хватает, но от Trianon'а за 1,5 года я как-то поболее набрался полезных вещей, чем из толстых книжек, где только текст, текст, текст.. | |
|
|
|
|
|
|
|
для: neadekvat
(23.10.2010 в 11:53)
| | да, я б тоже блог этого господина бы с удовольствием почитал. :)
но кстати книг тоже достаточно классных. пожалуй лучая на мой взгляд (да простит меня софттайм) - М. Зандстра "PHP объекты, шаблоны и методики программирования" 2 издание | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: Николай2357
(22.10.2010 в 22:29)
| | по привычке юзаю его в основном для ассоциативных | |
|
|
|
|
|
|
|
для: Николай2357
(22.10.2010 в 22:29)
| | в принципе вариант с for здесь все же будет правильнее. т.к элемент с индексом 0 мы в цикле больше не затрагиваем | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 11:15)
| | У вас еще вычислять размер массива необходимо :) | |
|
|
|
|
|
|
|
для: neadekvat
(23.10.2010 в 11:54)
| | ну в этом плане да)
так что все-таки спорно что лучше, хотя микросекунды замерять, как некоторые любят, думаю нет смысла)
зато если у массива фиксированная длина, то лучше все-так for я думаю 8) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 12:36)
| | Но самый лучший вариант - использовать стандартную функцию :) | |
|
|
|
|
|
|
|
для: neadekvat
(23.10.2010 в 12:44)
| | без б ;)
но не во всех языках такая имеется, насколько я знаю | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 11:15)
| | Чем он привлекателен, тем что экономит одну итерацию? Говоря словами Лукашенко, foreach "перетрахивает" массив, а у вас count(array) будет затратная, если массив будет приличным по объему. И довод "фиксированный массив", ниже, несостоятелен. Фиксированный это какой, который маленький размер имеет? | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 13:44)
| | неа, в котором фиксированное число элементов, например 5, 100, 1000, не важно....
универсальность конечно теряется.
по поводу foreach да, тем что экономит одну итерацию. экономия сомнительная, но логика неправильная на мой взгляд. впрочем в моем первом примере всё было намного хуже :)
p.s только не надо словами Лу, он мне противен :) | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 15:32)
| | в плане скорости да, судя по всему будет быстрее foreach
про count я вообще ничего не говорил. если мы знаем количество эл-ов в массиве count нам не нужен, напишем просто
<?php
for ($i = 1; $i < 100; $i ++)
// ...
?>
|
| |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 15:27)
| | Недостаток в том, что count() будет вычисляться в начале каждой итерации снова и снова.
Если и делать через for(), то нужно вынести вычисление размера за пределы цикла. | |
|
|
|
|
|
|
|
для: Саня
(23.10.2010 в 16:22)
| | собственно, это свойство языка, а не подхода. Достаточно идиотичное, на мой взгляд. | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 17:27)
| | а как себя такой поход ведет в C++ ? | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 17:45)
| | вместо count($arr) Вы там напишете sizeof(arr)/sizeof(arr[0]) | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 18:36)
| | не, это я знаю. интересует, если такой же алгоритм с for на C++, где вместо count будет sizeof...будет sizeof каждую итерацию заново высчитываться? | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 19:03)
| | Да. Условие перехода всегда исполняется перед началом новой итерации. Если бы условие выполнялось один раз, то получится либо бесконечный, либо неработающий цикл.
Конструкция for ( $i = 0; $i < count($array); $i++ ) настолько часто встречается, что разработчики РНР моглы бы отдельный оптимизационный хак сделать для неё. | |
|
|
|
|
|
|
|
для: Саня
(23.10.2010 в 19:09)
| | судя по всему хак это foreach 8)
ну и вынесение из цикла как вы писали, естественно | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 19:17)
| | Можете и не выносить:
for ( $i = 0, $k=< count($array); $i < $k; $i++ ) | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 20:17)
| | Это и есть вынос.
если <= исправить :) | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 20:29)
| | Не понял, я же скопированное отредактировал, добавил нужно и убрал лишнее.... неуж-то опять случаной ctrl+v тяпнул....
Я бы это назвал предварительным просчетом в объявлении ) | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 20:17)
| | это какой-то особый изврат? :) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 22:48)
| | for ( $i = 0, $k=count($array); $i < $k; $i++ )
Что в этом извратного? | |
|
|
|
|
|
|
|
для: sim5
(23.10.2010 в 23:09)
| | для это задачи я имел ввиду) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 23:39)
| | Для этой задачи вообще не надо циклов, ибо есть готовая функция, но коли писать циклы значит надо озаботиться - какой из них, и как. | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 19:03)
| | sizeof(arr)/sizeof(arr[0]) - константное выражение, вычисляется один раз на этапе компиляции - при исполнении в коде сидит уже вычисленное число.
Понятно, что интерпретируемый язык так не объедешь.
Но, блин горелый, зачем для выяснения числа элементов в массиве нужно вызывать явную функцию, с полным чемоданом накладных расходов на создание контекста - мне не понять.
Но мне много чего не понять. Тот же intval() и (int) - те же йайцы. | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 19:32)
| | а мне как раз intval() и (int) понятны...
судя по всему, intval придумали для того, чтобы юзать его как callback для функций типа array_map и т.п или для пользовательских.
хотя, если даже вы не понимаете...может быть я ошибаюсь :) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 22:47)
| | Собственно array_map и задействует пользовательскую callback .
Ну был бы intval пользовательским - я б не обиделся.
Сам написал - сам понимаешь, что быстро не будет.
Да только в явном вызове-то что мешало inline-оптимизацию реализовать? | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 23:12)
| | если честно то я даже не знаю что это ("inline-оптимизацию") :) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 23:37)
| | В данном контексте - применительно к php - я имел в виду чтоб запись intval(выражение) исполнялась как ((int)(выражение)) | |
|
|
|
|
|
|
|
для: Trianon
(23.10.2010 в 23:52)
| | теперь понятно. может быть стоит спросить где-нибудь на просторах php.net :) | |
|
|
|
|
|
|
|
для: psychomc
(23.10.2010 в 23:57)
| | >>может быть стоит спросить где-нибудь на просторах php.net :)
Не надо этого делать. Ибо все в точности до наоборот - просторы должны спрашивать тут :).
А что касается циклов - есть тонкий баланс между скоростью исполнения и читабельностью кода.
В данном случае foreach предпочтительнее из-за последнего, так как искать прироста производительности в таком микроскопическом объеме против читабельности - бред и паранойя. | |
|
|
|
|
|
|
|
для: Николай2357
(24.10.2010 в 09:20)
| | согласен по поводу бреда, хотя если вспомнить те же int и intval - в какой-то теме еще раньше писали, что не надо юзать intval, (int) быстрее :) | |
|
|
|
|
|
|
|
для: psychomc
(24.10.2010 в 11:51)
| | (int) не просто быстрее работает. Его и написать быстрее. И прочитать)))
Ровно как и foreach.
Лень - двигатель прогресса. :) | |
|
|
|
|
|
|
|
для: Николай2357
(24.10.2010 в 18:30)
| | :) | |
|
|
|
|
|
|
|
для: Николай2357
(24.10.2010 в 09:20)
| | Хотите сказать, что foreach читается как у "Лукоморья дуб зеленый...", а for, это нечто похожее на сопромат? ;-) | |
|
|
|