我正在通过循环在某些文本字段内输出值的方式构建表单。我需要检查是否有重复的值。我想我还需要将这些值放入一个数组中,并在每个输出中对其进行检查。
$duplicates = array();
$has_duplicate = false;
foreach ($vals AS $v) {
if (in_array($v->val, $duplicates)) {
$has_duplicate = true;
}
echo '<input type="text" value="'.$v->val.'" class="'.($has_duplicate ? 'dupe' : '').'">';
$duplicates[$v->val] = true;
}
像这样吗?
答案 0 :(得分:2)
我认为,如果要标记 all 重复的值,则需要将$vals
进行两次迭代。否则,多次出现的值的第一个实例将不会被标记为重复项,因为在再次遇到该值之前,无法确定它是重复的。
foreach ($vals as $v) {
if (isset($unique[$v->val])) $duplicates[$v->val] = true;
$unique[$v->val] = true;
}
foreach ($vals as $v) {
$class = isset($duplicate[$v->val]) ? 'dupe' : '';
echo '<input type="text" value="'. $v->val .'" class="'. $class .'">';
}
如果您只想使用dupe
类标记值的后续实例,则将执行一个循环
foreach ($vals as $v) {
$class = isset($unique[$v->val]) ? 'dupe' : '';
echo '<input type="text" value="'.$v->val.'" class="'. $class .'">' . "\n";
$unique[$v->val] = true;
}
答案 1 :(得分:1)
实际上我看到了问题:
foreach ($vals AS $v) {
if (in_array($v->val, $duplicates)) {
$has_duplicate = true;
}
$duplicates[$v->val] = true;
例如,您需要检查isset
:
foreach ($vals AS $v) {
$has_duplicate = false; //reset on each iteration of the loop
if (isset($duplicates[$v->val])) {
$has_duplicate = true;
}
....
问题是in_array
在values
中查找,并且您将所有值都设置为true
,则需要检查键($duplicates[$v->val] = true;
)所在的位置放置数据。
您还可以使用array_key_exists()
进行检查,但是没有人使用它,因为它比isset慢。
in_array —检查数组中是否存在值
bool in_array (混合的 $ needle ,数组 $ haystack [,bool $ strict = FALSE])
http://php.net/manual/en/function.in-array.php
我做了很多次之后才愿意承认。
更新
一种更好的编写方法是只删除局部变量,因为它并不是真正需要的变量(除非有其他地方使用,不包含在问题中)
foreach ($vals AS $v) {
echo '<input type="text" value="'.$v->val.'" class="'.(isset($duplicates[$v->val]) ? 'dupe' : '').'">';
$duplicates[$v->val] = true;
}
如果将$duplicates[$v->val] = true;
设置为True为True,则实际上并没有什么不同。
干杯!
答案 2 :(得分:1)
如注释中所述,您每次在循环中都需要重置$has_duplicate
,而不要保留上一次迭代中的值。所以你可以简单地做:
$has_duplicate = isset($duplicates[$v->val]);