php:将mysql查询的结果循环到增量计数器(关联数组)

php:将mysql查询的结果循环到增量计数器(关联数组),php,mysql,loops,switch-statement,associative-array,Php,Mysql,Loops,Switch Statement,Associative Array,我正在从MySQL数据库中检索数据并从中创建报告。我需要在满足某些条件时获得计数,因为db查询非常昂贵,而且我会有很多流量,所以我会循环遍历单个查询的结果以增加计数器 它似乎在工作——计数器在递增,结果有些接近,但计数器不正确 目前,表中有411条记录,但我从[total]计数器中得到了934条和[males]927条这样的数字,这肯定是不对的。然而,我从['females']得到4,这是正确的 我很确定它昨晚起作用了,但现在不行了——我很困惑。现在只有411条记录 $surveydata =

我正在从MySQL数据库中检索数据并从中创建报告。我需要在满足某些条件时获得计数,因为db查询非常昂贵,而且我会有很多流量,所以我会循环遍历单个查询的结果以增加计数器

它似乎在工作——计数器在递增,结果有些接近,但计数器不正确

目前,表中有411条记录,但我从[total]计数器中得到了934条和[males]927条这样的数字,这肯定是不对的。然而,我从['females']得到4,这是正确的

我很确定它昨晚起作用了,但现在不行了——我很困惑。现在只有411条记录

$surveydata = mysql_query("SELECT `age`,`e_part`,`gender` FROM $db_surveydata;") or die(mysql_error());
$rowcount = mysql_num_rows($surveydata);
$age=array('18+'=>0,'<18'=>0,'total'=>0);
$e_part=array('yes'=>0,'no'=>0,'total'=>0);
$genders=array('male'=>0,'female'=>0,'trans'=>0,'don\'t know'=>0,'total'=>0);

while ($responses = mysql_fetch_assoc($surveydata)) {
    foreach ($responses as $response){
        switch ($response){
            case $responses['age']:
                if ($responses['age'] > 18) {$age['18+']++;$age['total']++;}
                // i tried putting the ['total'] incrementer in the if/else
                // just in case, but same result
                else {$age['<18']++;$age['total']++;}
                break;
            case $responses['e_part']:
                if ($responses['e_part']) {$e_part['yes']++;}
                else {$e_part['no']++;}
                $e_part['total']++;
                break;
            case $responses['gender']:
                switch ($responses['gender']){
                    case 1:$genders['male']++;break;
                    case 2:$genders['female']++;break;
                    case 3:$genders['trans']++;break;
                    case 9:$genders['don\'t know']++;break;
                    default:break;
                }
                $genders['total']++;
                break;
            default:break;
        } // end switch
    } //end for
} // end while
谢谢

这就是问题所在:

foreach ($responses as $response){
        switch ($response){
            case $responses['age']:
switch$responses查找匹配项

foreach ($responses as $k=>$v){
    switch ($k){
        case 'age':
            if ($v > 18) ....
mysql_fetch_assoc从表中检索一行。然后在该行上循环,处理每个字段。然后,长时间的if检查确定您在哪个字段上。整个结构可以更改为:

while($response = mysql_fetch_assoc($surveydata)) {
    if ($responses['age'] > 18) {
        $age['18+']++;
    } else {
        $age['<18']++;
    $age['total']++;}

    if ($responses['e_part']) {
        $e_part['yes']++;
    } else {
        $e_part['no']++;
    }
    $e_part['total']++;

    switch ($responses['gender']){
        case 1:$genders['male']++;break;
        case 2:$genders['female']++;break;
        case 3:$genders['trans']++;break;
        case 9:$genders['don\'t know']++;break;
        default:break;
    }
    $genders['total']++;
}
不需要switch$响应;你不可能真正打开这样的数组。即使你可以,你得到的“值”也没有任何意义——我想如果它真的有效,你打开的值应该是“数组”或数组的长度。我忘了PHP是如何将数组作为标量处理的

你会想要这样的东西

$total = 0;
while ($response = mysql_fetch_assoc($surveydata))
{
    if (isset($response['age']))
    {
        ++$age[($response['age'] < 18) ? '<18' : '18+'];
        ++$age['total'];
    }
    if (isset($response['e_part']))
    {
        ++$e_part[($responses['e_part']) ? 'yes' : 'no'];
        ++$e_part['total'];
    }
    if (isset($response['gender']))
    {
        switch ($response['gender'])
        {
             case 1: ++$genders['male']; break;
             case 2: ++$genders['female']; break;
             case 3: ++$genders['trans']; break;
             case 9: ++$genders["don't know"]; break;
        }
        ++$genders['total'];
    }
    ++$total;
}

国际单项体育联合会的好处在于。。。如果'age'、'e_part'或'gender'为空,则计数它的相应代码将不会被激活。它的作用与您的代码差不多,减去令人尴尬的循环,并减去字段的计数,即使它为空,因为每一行都有相同的字段。

尝试在代码中插入一些调试语句,以缩小问题的范围。嗨,Marc,['total'的位置]s看起来很麻烦:它们不是每个循环都递增吗?此外,我尽量避免使用一系列的if语句,因为我遇到了一些问题,当有太多的if语句时,不能/不适当地激活它们,这完全可能是我的错,但尽管如此,我还是尽量避免这样做。如果它们在不应该的时候激活,或者反之亦然,问题几乎可以肯定是对测试条件和/或值的误解。在不需要切换的情况下切换完成后看起来很奇怪。也就是说,只要if和/或else更合适,您的查询就会检索每一行的年龄/e_部分/gender字段。因此,age total/e_part total/gender_total的单个计数正好等于检索到的行数。如果您允许问题不被回答,并且只想计算填写的答案,那么您必须执行If$response['age']!=={$age['total']++;}键入thing.ahh!天才和清洁剂。谢谢!!'清洁工?我认为,把$v作为一个年龄、一个e_部分或一个性别——都放在同一个循环中——是非常混乱的也就是说,它确实解决了损坏的foreach的问题。这不是一个建议,只是一个错误修复。我不会对$response进行迭代,因为所有情况都被不同地处理,因此它不会保存代码。