[英]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.