проблема php, имеющая сумму значений в цикле - PullRequest
2 голосов
/ 10 августа 2011

Я новичок в php и застрял, делая цикл.

У меня есть следующее:

  • массив, содержащий 0 или не названный $receivers.
  • другой массив, содержащий общее количество получателей, которое является числом, с именем $totalreceivers.
  • функция, запрашивающая таблицу с идентификатором, возвращающая 0 или число с именем status().

Я хочу просмотреть все status() получателей и показать сумму в конце.Я не мог получить это.

Любая помощь будет оценена.Заранее спасибо.

Вот что я попробовал:

for ($i = 0; $i < $totalreceivers; $i++)
{
    $status = status($receivers[$i]);
    foreach ($totalreceivers as $value)
        $status = status($receivers[$i]); 
    echo "the sum of receiver having status different than 0 is";
    echo count($status);
}

function status($id)
{
    global $dbhost;
    global $dbuser;
    global $dbpass;
    global $dbname;
    global $d1;

    $q2 = mysql_query("select * from user where id ='$id' AND subscription_end_date IS NULL", $d1);

    while($row2 = mysql_fetch_array($q2))
        $rowservice = $row2['value'];
    return $rowservice;
}

Ответы [ 4 ]

1 голос
/ 10 августа 2011

Пара вещей в вашем коде не имеет смысла.Во-первых, вы пытаетесь дважды выполнить $totalreceivers, один цикл вложен в другой.Я сомневаюсь, что это то, что вы хотите, поэтому вы должны избавиться от одного из них.И ваш первый цикл имеет плохое выражение: чтобы перебрать $totalreceivers в вашем первом цикле for, вам нужно, чтобы ваше тестовое выражение соответствовало количеству элементов в массиве, а не самому массиву (можно использовать count ()): for ($i = 0; $i < count($totalreceivers); $i++).

Во-вторых, вы сбрасываете значение $status каждый раз, когда вызываете status() в цикле.Чтобы добавить к этому, используйте оператор +=: $status += status($receivers[$i]);

В-третьих, вы делаете то же самое в функции status () с $rowservice;сбрасывать его каждую итерацию этого цикла while.Либо установите его один раз, либо суммируйте.

0 голосов
/ 10 августа 2011

Ниже я постараюсь описать некоторые возможные проблемы с вашим кодом:

for ($i = 0; $i < $totalreceivers; $i++) { //This open bracket has no end bracket
/*I assume total receivers is the number of receivers; if that is the case, it shouldn't be an array, but merely a value.*/
            $status = status($receivers[$i]); 
/*I think you should define the status function before you call it; also, if you are just calling the status function for each value of $receivers, why don't you just do a foreach($receivers as $value) loop, like you did below with $totalreceivers. */
         foreach ( $totalreceivers as $value)
/*I'm not sure what $totalreceivers is.  You said its an array containing total number of receivers; again, I would think this would be a single value, and not an array*/
        {
        $status = status($receivers[$i]); 
/*looks like you're calling the status function again*/
        }
            echo "the sum of receiver having status different thant 0 is";  echo count($status); 
/* $status at this point would count the value from row2 for the last value in $receivers, and not a count of array values.  Perhaps you could do $status[] = status($receivers[$i]), and then count($status) to save each value to an array, then count the elements. */

function status($id){
global $dbhost;
global $dbuser;
global $dbpass;
global $dbname;
/* The values above aren't used in the function; you may want to connect to the database outside of the function, before the foreach loop. */
global $d1 ;

$q2 = mysql_query("select * from user where id ='$id' AND subscription_end_date IS NULL",$d1);
while($row2 = mysql_fetch_array($q2)){
$rowservice = $row2['value'];
}
return $rowservice;
}
/*the rest looks good*/
0 голосов
/ 10 августа 2011

Вы можете упростить эту задачу, позволив MySQL сделать больше работы за вас.

У вас есть массив $receivers, который предположительно содержит идентификаторы для подписчиков (получателей) чего-либо. (Я могу использовать получателя и абонента взаимозаменяемо.)

Функция status() извлекает из базы данных value для каждого получателя, где subscription_end_date равно нулю. Я собираюсь предположить, что для каждого подписчика существует только одна строка, поскольку вы возвращаете последний результат только через переменную $rowservice.

Из вашего кода неясно, хотите ли вы получить число получателей с value, отличным от 0, или если вам нужна сумма всех ненулевых значений. Тогда возникает вопрос:

  • Хотите узнать, сколько подписчиков имеют ненулевые значения? или
  • Хотите узнать сумму всех значений для подписчиков с ненулевыми значениями?

К счастью, оба из них можно легко найти:

Сколько получателей имеют ненулевые значения?

$allreceivers = implode(',', $receivers);
$query = "SELECT COUNT(id) AS total_receivers
    FROM user
    WHERE subscription_end_date IS NULL
    AND value != 0
    AND id IN ($allreceivers);";
$result = mysql_query($query, $d1);
$row = mysql_fetch_array($result);
$total_receivers = $row['total_receivers'];

echo "The number of receivers having status (value) other than 0 is $total_receivers";

Какова сумма всех значений приемника?

$allreceivers = implode(',', $receivers);
$query = "SELECT SUM(value) AS receiver_value_sum
    FROM user
    WHERE subscription_end_date IS NULL
    AND id IN ($allreceivers);";
$result = mysql_query($query, $d1);
$row = mysql_fetch_array($result);
$receiver_value_sum = $row['receiver_value_sum'];

echo "The sum of receiver values is $receiver_value_sum";
0 голосов
/ 10 августа 2011

На первый взгляд кажется, что вы просто перезаписываете "$ status" на каждой итерации.Перед началом цикла установите $ status в пустой массив, а затем добавляйте его в каждую итерацию.Например:

    $status = array();
    foreach ( $totalreceivers as $value)
    {
    $status[] = status($receivers[$i]); 
    }
    echo count($status);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...