【问题标题】:for loop > if-statement ($foo=$array[$i])for 循环 > if 语句 ($foo=$array[$i])
【发布时间】:2011-09-16 14:30:40
【问题描述】:

我正在尝试简化一些代码,其中我有一个非常长的 switch 语句(20 多个案例)。我唯一需要的就是增加一个计数器。

当前工作的开关是这样设置的:

//multidimensional-array is above
while ($responses = mysql_fetch_assoc($surveydata)){
    switch($responses['cou_mun']){
        case "New York":
            $targetCities[0][1]++;
            break;
        case …
    }
}

我有以下多维数组和for循环:

//           [index]   'city name',count,minimum
$targetCities[0]=array('New York City',0,250);
$targetCities[1]=array('Los Angeles',0,250);
// 20 more

$responses = mysql_fetch_assoc($surveydata); //this is taken from the while-loop when I comment out the while() and switch().

for ($i=0; $i < count($targetCities); $i++){

    if ($responses['cou_mun'] == $targetCities[$i][0]){$targetCities[$i][1]++;}
    else{$nontargetcity++;}

    echo "<li><span>" . $targetCities[$i][0] . "</span><span>" . $targetCities[$i][1] . "</span>" . amountUnderMin($targetCities[$i][1],$targetCities[$i][2]) . "<span>" . $targetCities[$i][2] . "</span><span>" . cityMinMet($targetCities[$i][1],$targetCities[$i][2]) . "</span></li>";
}

$responses['cou_mun'] 返回一个城市名称(例如“洛杉矶”)。

唯一不起作用的是if(增加计数器)。

我希望当前 $targetCities 的第二个维度会增加,但是当该行被打印/回显时,它仍然显示为0(但我可以在 Db 中看到不止一个“洛杉矶”)。

附:我确保数组中的名称与 Db​​ 中的名称选项完全匹配(拼写+空格+大小写)。

谢谢!

编辑:$nontargetcity 计数器返回 21(案例数)。

【问题讨论】:

  • 您是否尝试在增量后立即执行回显以查看值的样子 - 并验证该行是否已执行?
  • 您是否尝试过从if 块中回显以查看是否实际到达?

标签: php mysql if-statement multidimensional-array


【解决方案1】:

数组字面量允许嵌套:

$targetCities = array(
    array('New York City',0,250),
    array('Los Angeles',0,250),
);

使用关联数组:

$targetCities = array(
    array('name' => 'New York City', 'count' => 0, 'minimum' => 250),
    array('name' => 'Los Angeles', 'count' => 0, 'minimum' => 250),
);

使用foreach 代替for(;;):

foreach($targetCities as $key => $city) {
    if ($responses['cou_mun'] == $city['name']) {
        $targetCities[$key]['count']++;
    }

使用 var_dump() 调试变量的值:

var_dump($responses['cou_num']);

foreach($targetCities as $key => $city) {
    var_dump($city['name'], $responses['cou_mun'] == $city['name']);

【讨论】:

  • 他的逻辑是合理的;这只是语法糖。
  • 我还认为$targetCities 数组来自mysql_fetch_array()
  • mysql_fetch_array() 返回关联数组
  • @arnaud576875:哦酷!谢谢(现在试试)。起初我试图做关联数组,但是当我调用它时我的语法错误。 最后一个子数组应该有逗号吗?
  • 是的,你可以留下逗号,这是允许的(并且方便)
【解决方案2】:
$surveydata = mysql_query( … );
$targetCities[0]=array('New York',0,250);
$targetCities[1]=array('Los Angeles',0,250);
//etc
//etc
//etc
$respondentCities=array();

while ($responses = mysql_fetch_assoc($surveydata)) {
    array_push($respondentCities,$responses['cou_mun']);
} //i'm sorting the values in $respondentCities because i need them later

//function amountUnderMin(){…}
//function cityMinMet(){…}

for ($i=0; $i < count($targetCities); $i++){
    foreach($respondentCities as $respondentCity){
        if($respondentCity==$targetCities[$i][0]){$targetCities[$i][1]++;break;}
    }
    echo "<li><span>" . $targetCities[$i][0] . "</span><span>" . $targetCities[$i][1] . "</span>" . amountUnderMin($targetCities[$i][1],$targetCities[$i][2]) . "<span>" . $targetCities[$i][2] . "</span><span>" . cityMinMet($targetCities[$i][1],$targetCities[$i][2]) . "</span></li>";
}

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-06-09
    相关资源
    最近更新 更多