检查重复值

时间:2018-10-25 21:50:09

标签: php

我正在通过循环在某些文本字段内输出值的方式构建表单。我需要检查是否有重复的值。我想我还需要将这些值放入一个数组中,并在每个输出中对其进行检查。

$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;       
}

像这样吗?

3 个答案:

答案 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_arrayvalues中查找,并且您将所有值都设置为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]);