繁体   English   中英

PHP的foreach循环两次

[英]php foreach looping twice

我正在尝试遍历数据库中的某些数据,但它输出了两次。

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

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

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

这困扰了我太久了,所以如果有人可以帮助我,我将非常感激!

可能是fetchAssoc()返回一个同时带有数字( fetchAssoc() )和字符串(列名)键的数组。 请参阅PDOStatement :: fetch()文档页面上的PDO::FETCH_BOTH

另外:这样做的原因与fetchAssoc()默认情况下返回双fetchAssoc()数组的原因相同:PHP在数字索引和字符串索引数组之间没有区别; 取决于您使用哪种。

忘记所有复杂的解释。 您的问题是由在该循环内使用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:{%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 :%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 as $ income){$ result。=“处理长度为数组的一笔收入”。 sizeof($ incomes); }

...我得到...“用长度为3的数组处理一笔收益”“用长度为3的数组处理一笔收益”“用长度3的数组处理一笔收益”“从长度为3的数组一笔收益3“”使用长度3的数组处理一笔收益“”“使用长度3的数组处理一笔收益”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM