【问题标题】:php foreach looping twicephp foreach循环两次
【发布时间】:2011-06-01 05:09:25
【问题描述】:

我正在尝试循环访问我的数据库中的一些数据,但它输出了两次。

$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 中找到 Egg。编号:5.
成功!在 field3 中找到 Egg。编号: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 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:5.
成功!在 field3 中找到 Egg。编号:5.
成功!在 field3 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:5.
成功!在 field3 中找到 Egg。编号:5。

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

成功!在 field3 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:E.
成功!在 field3 中找到 Egg。编号:5.
成功!在 field3 中找到 Egg。编号:5。

这件事困扰我太久了,所以如果有人能提供帮助,我将非常感激!

【问题讨论】:

  • 在输出中添加 $i 的值可能有助于解决问题。 $i 不应该从 0 开始吗​​?
  • 也许查询结果类似于左连接,并且为每个连接元素返回相同的元素
  • 您有重复的行吗?这个查询在 phpMyAdmin(或类似的数据库管理工具)中输出什么?
  • @kinjal $i 输出 2,即使我将 $i 更改为从 0 开始。@Yanick 没有重复的行。 phpMyAdmin 中的输出符合预期。
  • 所以你的第三次迭代返回 4 行,而其他 3 行什么也不返回?请注意,您为变量选择的名称会使代码不可读。两个问题:$row 是什么? from() 的第二个参数是什么意思?

标签: php foreach associative-array zend-db


【解决方案1】:

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

补充:原因与fetchAssoc() 默认返回双精度数组的原因相同:PHP 不区分数字索引数组和字符串索引数组;两者都由你决定。

【讨论】:

  • 我尝试过使用 $sth = $writeConn->prepare($sql); $sth->执行(); $result = $sth->fetch(PDO::FETCH_ASSOC);没有任何运气。结果还是一样。
  • 很奇怪。你确定那是放置获取模式参数的地方吗?你用的是什么库?
  • 这是我正在开发的一个 Magento 模块
【解决方案2】:

忘记所有复杂的解释。您的问题是由在该循环中使用 echo() 引起的。我遇到了同样的问题(见下文),foreach 循环无缘无故地运行了两次。

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

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

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

echo() 函数以某种量子方式破坏了 PHP 的成就感:你让它感觉它同时已经完成了你的代码的运行,并且还没有开始。我无法解释细节,但结果很古怪。

我的问题是: 我在使用不同的 foreach 设置时遇到了同样的问题。在我的例子中,数组来自一个 HTTP 请求 URL:

//myfakeserver/functions/dealWithIncomes.php?i={%220%22:{%22amount%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:{%22amount%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:{%22amount%22:443,% 22T1%22:%22year%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($incomes 作为 $income){ $result .= "处理长度为数组的一项收入" . sizeof($ 收入); }

...我明白了... “处理长度为 3 的数组的一项收入” “处理长度为 3 的数组的一项收入” “处理长度为 3 的数组的一项收入” “处理长度为 3 的数组的一项收入” “处理长度为 3 的数组的一项收入” "处理一个长度为 3 的数组的收入"

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2020-04-04
    • 2016-09-26
    • 2012-07-19
    • 2018-07-01
    • 2014-07-19
    相关资源
    最近更新 更多