php - 在for循环中使用数组变量

时间:2014-11-04 19:05:28

标签: php arrays pdo foreach

我有这个PHP代码,带有for循环:

        $expireData = array();
        for($x = 0; $x <= 10; $x++){
            $stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
            $stmt->bindParam(":username",$userdata['username']);
            $stmt->execute();

            $row = $stmt->fetchAll();

            #var_dump($row);

            if($row["cnt"] > 0){
                $expireData[]  = $row["cnt"];
            }else{
                $expireData[] = 0;
            }
        }

如果我执行var_dump($row)我得到:

array(2) {
  [0]=>
  array(4) {
    ["days"]=>
    string(2) "27"
    [0]=>
    string(2) "27"
    ["cnt"]=>
    string(1) "2"
    [1]=>
    string(1) "2"
  }
  [1]=>
  array(4) {
    ["days"]=>
    string(3) "116"
    [0]=>
    string(3) "116"
    ["cnt"]=>
    string(1) "8"
    [1]=>
    string(1) "8"
  }
}

但是,如果我只是echo $row['cnt'];它没有回应任何东西 - 它是空的。为什么呢?

最终,我希望在for循环之外使用for循环中的数据 - 比如:

echo implode(',', $expireData);

但那只是给了我

0,0,0,0,0,0,0,0,0,0

我做错了什么?

1 个答案:

答案 0 :(得分:3)

由于您使用fetchAll()将所有行检索到$row,因此其内容是表示多个行的二维数组。所以键['cnt']存在,但是在数组中是一个维度。

$row['cnt']不存在但$row[0]['cnt']确实存在且$row[1]['cnt']确实存在。

使用当前代码的最简单的解决方案是将$expireData处理移到循环外部并进入自己的循环:

$expireData = array();

$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();

// Load all rows into $rows rather than $row...
$rows = $stmt->fetchAll();

// Loop over all rows to populate $expireData
foreach ($rows as $row) {
    if ($row["cnt"] > 0){
        $expireData[]  = $row["cnt"];
    }else{
        $expireData[] = 0;
    }
}    
print_r($expireData);

另一种方法是从fetchAll()切换到普通fetch()并在while循环中将行追加到$rows

// Array to hold all rows
$rows = array();

// (The outer for loop is removed...)    
$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from users WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();

// Perform single fetch() calls in a while loop
while ($row = $stmt->fetch()) {
  // Append onto array of all rows
  $rows[] = $row;

  // Then handle $expireData in the same loop
  if ($row["cnt"] > 0){
      $expireData[]  = $row["cnt"];
  }else{
      $expireData[] = 0;
  }
}

将数组填充为10个值:

根据评论中的确定,您需要最终的$expireData数组才能拥有10个值。不要使用循环,而是使用array_pad()将其扩展为10并用零填充。

$expireData = array_pad($expireData, 10, 0);
// turns [2,8] into [2,8,0,0,0,0,0,0,0,0]

关于for循环的注释:

使用外部for外观是可疑的,因为它显然每次都执行相同的语句。那个循环可能完全不需要,你只需要它的身体。

有关错误报告的说明:

在加载循环时,您没有看到PHP抱怨undefined index 'cnt'这一事实表明您在开启display_errors并且error_reporting已启用时未开发。在开发和测试代码时,始终这样做。它可能帮助您更快地看到问题。

在您的脚本顶部:

error_reporting(E_ALL);
ini_set('display_errors', 1);