![]() |
Помогите с алгоритмом...
Задача:
Человек может выбрать год - от 2003 до 2005 (в дальнейшем кол-во лет будет увеличено). При выборе 2005 нужно сложить переменные 1 + $yr2004 + $yr2003 При выборе 2004 нужно сложить переменные 1 + $yr2003 При выборе 2003 нужно сложить переменные 1 Смысл понятен? Нужно чтобы выбранный год складывался со всеми предыдущими (начиная с 2003). И чтобы это было полностью автоматически... как это сделать? |
У меня пока на уме что-то такое, но это сложно:
вводим test.php?yr=2005 PHP код:
|
А на каком языке?
|
joker99
PHP |
Neo
PHP код:
|
mmaaxx
Привет! Спасибо :). А я и не знал, что можно так вкладывать переменные: Цитата:
|
Variable variables
Sometimes it is convenient to be able to have variable variable names. That is, a variable name which can be set and used dynamically. A normal variable is set with a statement such as: PHP код:
PHP код:
At this point two variables have been defined and stored in the PHP symbol tree: $a with contents "hello" and $hello with contents "world". Therefore, this statement: PHP код:
produces the exact same output as: PHP код:
i.e. they both produce: hello world. In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second. Please note that variable variables cannot be used with PHP's Superglobal arrays. This means you cannot do things like ${$_GET}. If you are looking for a way to handle availability of superglobals and the old HTTP_*_VARS, you might want to try referencing them. |
mmaaxx
Классно. Я тоже об этом не знал. Вот уж век живи - век учись. С меня 5 (; Добавлено через 9 минут: Кстати можно было бы и массивом сделать. Благо массивы динамические. $yr_array = array ( 4 , 10, 10); $total = 0; // $yr_array[3] = 10; // for year 2006 for ($i = $yr - 2003 ; $i >= 0; $i-- ) $total += $yr_array[$i]; Конечно малёк сложнее, но проще ( моно вообще динамически ) будет добавлять года. |
С меня тоже :dance:
А почему вот это не работает: $sel[01]="selected"; $numstr = ${"sel[01]"}; var_dump ($numstr); // выдает NULL |
А, ну тут конечно не пойдёт. Переменной "sel[01]" то нет! есть переменная "sel" типа array и "01" элемент оной является строкой "selected".
Если //$selected=1234; $sel[01]="selected"; $numstr = ${$sel[01]}; // или = ${${"sel"}[01]}; По-идее будет работать, если я правильно понял намеренья. ( я не проверял ) (; Добавлено через 4 минуты: Тут имхо на эвалюацию строк в ЛИСПе логика похожа. Плохой стиль, но бывает полезно... |
не, не правильно. еще раз:
есть PHP код:
зы. что такое ЛИСП? |
В предыдущем случае, прежде чем вызывать переменную её надо эвалюировать ( термином LISPа - это язык такой ... с круглыми скобками (; )
Для эвалюации и используется ${имя_переменной_как_строка} ( И почему нет? Я даже спецом проверил ... оба варианта работают ) Мало того Цитата:
PHP код:
Отсюда ошибка: Parse error: parse error, unexpected '\"', expecting T_STRING or T_VARIABLE or T_NUM_STRING , что по-русски - он ждал индексации массива, так как нашел "[", а индексации не произошло. Объясни на словах, что ты хочешь добиться? PS Да, и старайся таки следовать принципу KISS.. Это и так плохой стиль, а ещё усложнять.... хотя смотри сам. Добавлено через 14 минут: Или, уж если очень хочется с 01 -09 то PHP код:
|
Нет. не работает. выходит <option ><option ><option ><option >....
Добавлено через 6 минут: Сложновато объяснить чего я хочу.. но - попробую. Короче, есть выпадающее меню навигации (см. здесь: http://shabash.dreamsee.ru/xron.html) Допустим, начало: PHP код:
<option <?php echo "$sel[01]"; ?> value=1>01 [005]</option> <option <?php echo "$sel[02]"; ?> value=2>02 [006]</option> <option <?php echo "$sel[03]"; ?> value=3>03 [007]</option> <option <?php echo "$sel[04]"; ?> value=4>04 [008]</option> ... и так далее, строк столько, сколько выпусков в году. далее, человек выбирает выпуск 1, год 2004. значит, PHP код:
<option <?php echo "$sel[01]"; ?> value=1>01 [005]</option> причем этих строк столько, сколько выпусков в текущем году. достаточно понятно? |
Фи! Так то и есть последствия плохого стиля (; ( не в обиду сказано... сам страдаю периодически )
Смотри - ты индексируешь массив челыми числами, а обратиться хочешь, индексируя строками. Тут надо определиться. Или так: PHP код:
PHP код:
|
sky7
Спасибо. Еще одна вещь, которой я не знал - что массив можно индексировать числами или строками. думал - числа всегда есть числа :) кроме того, чего вдруг sprintf возвращает строку? ведь то что он возвращает есть число. :confused: а что ты называешь плохим стилем? |
Цитата:
Цитата:
Цитата:
Всегда пожайлуста :yees: |
Всем спасибо. Вот что у меня получилось: (конечно сложно читать но что ж поделаешь я не мастер языка пхп - пока что :) )
PHP код:
|
В чем ошибка?
<?php $year[2003]="selected"; $year[2004]="selected"; for ($i = 2003; $i <= 2005; $i++) { var_dump (${"year[$i]"}); // NULL } ?> |
Neo
<?php $year[2003]="selected"; $year[2004]="selected"; for ($i = 2003; $i <= 2005; $i++) { var_dump (${"year"}[$i]); // NULL } ?> |
mmaaxx
Ошибаисси. Не работает или ты не понял чего я хочу. работает так: <?php $year[2003]="selected"; $year[2004]="selected"; for ($i = 2003; $i <= 2005; $i++) { var_dump ($year[$i]); // selected, selected, NULL } ?> |
Мда, я просто увидев ${"year[$i]"}, сразу подумал (и ответил) что нужно (или по крайней мере желательно) выносить "сложные" конструкции переменных (а-ля $c->var, $a['var'] ) из строки, пхп не во всех слуйчаях их коректно находит.
Тот что я запостил у меня работает на ура (и выдайёт то же что и твой пост. А вообще конечно ты прав на все 100% что там вообще ненужна никакая ${}. Добавлено через 3 минуты: Да и вообще имхо удобнее, правильнее и бысрее (по выполнению) общаться к переменным имя которой в строке через $_GLOBALS[$myvar] а не ${$myvar}. Заодно и путаницы с массивами не будет (ну или по крайней мере не должно быть). :) |
Кто нибудь мне может внятно объяснить, когда нужно ${} , а когда просто $?
|
Neo
Когда не знаешь точного названия переменной: Не нужно: ${"var1"} , проще и быстрее $var1 Нужно: ${"my_".$i."_var"} , сдесь мы не знаем названия переменной и поэтому юзаем ${} (но правильнее в таких слуйчаях (как было сказаны выше) использовать массив типа $my_var[$i]). Просто вместо ${"my_".$i."_var"}, с таким-же успехом можно использовать $_GLOBALS["my_".$i."_var"] (массив через который можно доступиться ко всем переменным. Для наявность можешь сделать: echo "<pre>"; print_r($_GLOBALS); echo "</pre>"; |
а не проще использовать формулу?
$yr_min=2003 $yr_max=2xxx $sum=($yr_max^2+$yr_max-$yr_min^2-$yr_min)/2 или $sum=($yr_max-$yr_min)*($yr_max+$yr_min+1)/2 арифметическая прогрессия... |
Gike
а смысл? формула непонятная :( :confused: |
Цитата:
Во-вторых, вместо переменных $year200x -я бы использовал массив. Так и писать и поддерживать код намного проще. В остальном.. да тут и не так много кода (; Да.. а ошибку подобную сообщению от 05-04-2004 01:08 я комментировал в своём ответе от 04-04-2004 00:27. |
Цитата:
Цитата:
Добавлено через 4 минуты: а как получить значение последнего элемента массива? |
Цитата:
|
Neo
Цитата:
|
mmaaxx
:beer: PS Сорри за флуд... |
mmaaxx
зачем - смотри здесь: http://shabash.dreamsee.ru/xron.html - блок навигации по выпускам. для красоты, короче. :) sky7 А чего, тут без меня пиво пьют? Нее я не согласен. Щас ваще уйду в монастырь :). mmaaxx :beer: Добавлено через 3 минуты: Ах да, я же забыл зачем пришел. Как сложить ВСЕ значения ВСЕХ ключей массива? Добавлено через 7 минут: А знаю вот так foreach ($years as $temp) $total_currnum += $temp; |
Neo
sky7 :beer: :) Neo Ты наверно имел введу ссумировать все значения масива (массив: $array[$key]=>$value), поскольку ключи сумируют так: if(!empty($a)) foreach($a as $key=>$value) $key_sum+=$key; Не забываем про проверку на пустоту, поскольку foreach будет ругаться, если масив пустой. |
mmaaxx
хм.. не надо на непустоту. надо на "массивность" проверять is_array вместо empty... $a = 1; тоже не пустая :) |
@_is_absent
совершенно верно |
Neo
Почитай про сумму арифметической прогрессии .... |
Всем спасибо :)
Gike а зачем здесь ар.прогрессия если можно сделать гораздо проще без таких сложных формул? |
Если Gike прав, и тебе действительно нужна прогрессия, то по формуле, хоть она и сложная, считаться будет быстрее чем цыклом (особенно если считать нужно много).
|
Neo
Так с формулой эффективнее. Если куда можно формулу какую впихнуть - намного быстрей прога работает, чем то-же самое циклами вычислять. Представь, что у тебя накопилось 10 000 выпусков, что-б их пересчитать, ты используешь цикл ( по 14 ) с одним арифметическим действием. Итого: (10 000/*выпусков*/ / 14/*в год*/) /*циклов*/ * 1 /*действие*/ ~= 80 /*операциям */ А формулой - у тебя 4 операции, не зависимо от количества выпусков. Разница в этом примере - 20 раз, а чем больше выпусков - тем больше разница. А после этого представь что у тебя бешенная посещаемоть( скажем 1000 человек в минуту запрашивают этот скрипт ) и прикинь насколько разной будет нагрузка на сервер. Добавлено через 1 минуту: Я не говорю, что та или иная формула подходит в этом конкретном примере - это сам думай... но если можно что-то посчитать формулой - то лучше так и сделать :yees: Добавлено через 1 минуту: mmaaxx И снова одинаково отвечаем ;) Ну и впрямь у моряков мысли сходятся :beer: |
а почему все решили что сумма аривметической прогрессии сложная формула?
если мне не изменяет память, то S(n) = (a1 + an)*n/2 или a1 + d*(n - 1)/2 a1 - первый член последовательности, an - последний. d - разность. |
Да, в принципе формула простая, но для человека не имевшего дело с математикой - не тривиальная. Хотя, ты прав .. с этой формулой может даже и проще разобраться чем с циклами...
|
| Часовой пояс GMT +4, время: 02:19. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.