php foreach循环两次

时间:2010-12-29 19:01:33

标签: php foreach associative-array zend-db

我试图从我的数据库中循环一些数据,但它输出两次。

$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';

$i=0;

while ($i<4) {  
    $f = $field[$i];
    $idd = $id[$i];
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
    $result = $writeConn->fetchAssoc($sql); 

        foreach ($result as $row) {
            echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
        }
    $i++;
}

对外输出:

  

成功!在field3中找到了蛋。 ID:5   成功!在field3中找到了蛋。 ID:5。

有人可以解释为什么它循环索引和 关联值?

更新

我做了一些游戏,并尝试了以下内容。

$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';

$i=0;

while ($i<4) { 
    $f = $field[$i];
    $idd = $id[$i];
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
    $sth = $writeConn->prepare($sql);
    $sth->execute();
    $result = $sth->fetch(PDO::FETCH_ASSOC);

        foreach ($result as $row) {
            echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
        }
    $i++;
}

有趣的是,这输出如下:

  

成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:5   成功!在field3中找到了蛋。 ID:5   成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:5   成功!在field3中找到了蛋。 ID:5。

我还尝试将$i添加到输出中,并按预期输出2。 如果我将fetch(PDO::FETCH_BOTH)更改为fetch(PDO::FETCH_ASSOC),则输出如下:

  

成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:E。
  成功!在field3中找到了蛋。 ID:5   成功!在field3中找到了蛋。 ID:5。

这一直困扰着我,所以如果有人能提供帮助,我会非常感激!

2 个答案:

答案 0 :(得分:1)

可能fetchAssoc()返回一个包含数字(0~n)和字符串(列名)键的数组。请参阅PDOStatement::fetch()文档页面上的PDO::FETCH_BOTH

添加:原因与fetchAssoc()默认返回双数组的原因相同:PHP不区分数字和字符串索引数组;这取决于你使用它们。

答案 1 :(得分:0)

忘记所有复杂的解释。您的问题是由在该循环中使用echo()引起的。我有同样的问题(见下文),其中foreach循环运行两次没有明显的原因。

如果您想从PHP代码中提供信息以进行测试,请创建一个文本字符串并向其中添加内容,如:

$result .= "<br>And then this thingy did those stuff";

如果您这样做并且只在流程结束时回显$ result,您会发现问题已经消失。

echo()函数以一种量子的方式混淆了PHP的成就感:你让它感觉它已经同时已经完成了运行你的代码,并且还没有开始。我无法解释细节,但结果非常夸张。

我的问题是: 我对foreach的不同设置有同样的问题。在我的例子中,数组来自HTTP请求URL:

// myfakeserver /功能/ dealWithIncomes.php I = {%220%22:{%22 amount%22:332,%22T1%22:%22month%22,%22M1%22:1,%22T2%22 :%22dayofmonth%22%22M2%22:20,%22T3%22:%22%22%22M3%22:0,%22S1%22:%22%22%22E1%22:%22%22} ,%221%22:{%22 amount%22:444,%22T1%22:%22week%22,%22M1%22:1,%22T2%22:%22dayofweek%22,%22M2%22:1,%22T3 %22:%22%22%22M3%22:0,%22S1%22:%22%22%22E1%22:%22%22},%222%22:{%22 amount%22:443,% 22T1%22:%22年%22%22M1%22:1,%部22t2%22:%22%22%22M2%22:0,%22T3%22:%22%22%22M3%22:0, %22S1%22:%222012-02-29%22%22E1%22:%22%22}}

$ incomes = json_decode($ _ GET ['i'],true);

换句话说,一个JSON字符串代表三个收入及其属性,如金额和重复模式。

PHP非常清楚地将此字符串理解为数组:sizeof($ incomes)返回3.

但是当我循环这件事......

foreach($ income as $ income){     $ result。=“从长度数组处理一个收入”。的sizeof($收入); }

......我明白了...... “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入”