Функция PHP возвращает 0, не знаю почему - PullRequest
1 голос
/ 30 июня 2011

Вот PHP, с которым я работаю:

Ниже значений из базы:

$quote = 49;
$add_amp = 0;
$con_array = "3,2,1";


function calcAddAmp($mul)
{
    $add_amp = $add_amp + $mul*($quote);

}


$con_array = explode(",", $con);

for($i = 0; $i < count($con_array); $i++) { 
    switch ($fun) {
        case 1:
            calcAddAmp(.01);
            break;
        case 2:
            calcAddAmp(.05);
            break;
        case 3:
            calcAddAmp(.02);
            break;
        case 4:
            calcAddAmp(.09);
            break;
    }
}



$quote = $quote + $add_amp;

Проблема видна здесь:

echo $add_amp;

$ add_amp возвращает0, что делает $ quote тем же значением, что и раньше, 49.

echo $quote;

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

Ответы [ 7 ]

1 голос
/ 30 июня 2011

Переменные имеют область действия .Установка $add_amp внутри функции не приводит к автоматическому изменению переменной с тем же именем вне функции.Если вы не return значение из функции, это бессмысленно.Я бы упростил все это ненужное switch / function до этого:

$multipliers = array(1 => .01, 2 => .05, 3 => .02, 4 => .09);

foreach ($con_array as $con) {
    $add_amp += $multipliers[$con] * $quote;
}
1 голос
/ 30 июня 2011

$add_amp объявлено вне вашей функции.

Если вы хотите изменить глобальную функцию, вам нужно изменить свою функцию следующим образом:

function calcAddAmp($mul)
{     
    global $quote;
    global $add_amp;
    $add_amp = $add_amp + $mul * $quote;
}

Это было бы дажелучше просто вернуть значение из вашей функции:

function calcAddAmp($mul,$a,$q)
{
    return $a + $mul * $q;
}

$add_amp = calcAddAmp(0.5,$add_amp,$quote);
0 голосов
/ 30 июня 2011

Цитата и add_amp должны быть глобальными.

global $quote;
global $add_amp;

$quote = 49;
$add_amp = 0;
$con_array = "3,2,1";


function calcAddAmp($mul)
{
    global $quote;
    global $add_amp;

    $add_amp = $add_amp + $mul*($quote);

}
0 голосов
/ 30 июня 2011

Вот еще один подход, используя ссылку:

function calcAddAmp(&$add_amp, $mul)
{
    global $quote;

    $add_amp += $mul*($quote);
}

пример использования:

calcAddAmp($add_amp, 0.5);
0 голосов
/ 30 июня 2011

$add_amp является локальной переменной в функции. Он будет переназначаться при каждом вызове функции, а переменная $add_amp, созданная вверху, всегда будет 0.

0 голосов
/ 30 июня 2011

Используйте глобальное ключевое слово в функции.И ваш переключатель неправильный $ fun не определен.

0 голосов
/ 30 июня 2011
for($i = 0; $i < count($con_array); $i++) { 
    switch ($fun) {

Я думаю, вы имели в виду:

for($i = 0; $i < count($con_array); $i++) { 
    switch ($con_array[$i]) {

В противном случае ваши дела никогда не совпадут (так как $fun не существует), calcAddAmp никогда не вызывается и значение $add_amp никогдаизменения.


Вы также должны обязательно использовать global $add_amp и $quote в calcAddAmp, как в тот момент, когда выработая с некоторыми новыми локальными с тем же именем:

function calcAddAmp($mul) {
   global $add_amp, $quote;
   $add_amp += $mul * $quote;
}

или

function calcAddAmp($mul) {
   $GLOBALS['add_amp'] += $mul * $GLOBALS['quote'];
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...