交叉检查php中的多个变量是否相等

时间:2016-11-22 15:04:12

标签: php

是否有任何有效的方法可以相互检查这些多个变量值? 示例:如果$v1的值为 abc $v2的值为 abc 且其他变量为空,则返回错误,因为两个值相同。
另一个示例:如果$v1的值为 abc $v4的值为 abc 且其他变量为空,则返回错误,因为两个值相同。
比如检查每个变量与其他变量,如果它与任何人相同,则返回错误。

$v1 = $_POST['v1'];
$v2 = $_POST['v2'];
$v3 = $_POST['v3'];
$v4 = $_POST['v4'];
$v5 = $_POST['v5'];
$v6 = $_POST['v6'];

5 个答案:

答案 0 :(得分:1)

将它们作为关键字放入assoc数组,然后检查它的len。

$vars = [];
$keys = ['v1', ..., 'v6'];
foreach ($keys as $k) {
    $vars[$_POST[$k]] = true;
} 

if (count($vars) != count($keys)) {
    echo 'Duplicates found!';
}

说明:

$_POST = [
    'v1' => 'abc',
    'v2' => 'cde',
    'v3' => 'abc',
]
$vars = [];
$keys = ['v1', 'v2', 'v3'];

// 1st foreach iteration:
$vars['abc'] = true;  // $vars = ['abc' => true];

// 2nd foreach iteration:
$vars['cde'] = true;  // $vars = ['abc' => true, 'cde' => true];

// 3rd foreach iteration:
$vars['abc'] = true;  // Again 'abc'! $vars is still ['abc' => true, 'cde' => true];

print_r(count($vars) == count($keys));  // 2 == 3

此算法的复杂度为O(n),如果最后一个使用排序,则使用array_unique()可能为O(n*log(n))

答案 1 :(得分:1)

$v1 = 1;
$v2 = 2;
$v3 = 3;
$v4 = 4;
$v5 = 5;
$v6 = 5;
$values = [$v1, $v2, $v3, $v4, $v5, $v6];
if (count($values) !== count(array_unique($values))) {
    echo 'Duplicates found';
}

<强> DEMO

已更新

您可以轻松使用array_count_values函数来确定哪些值是重复的。 我把它放在这里:http://phpio.net/s/16bh

答案 2 :(得分:0)

我添加了评论,如果你不明白的话可以随意问一下,希望它会帮助你理解这个:)

<?php
    $f1 = 'abc';
    $f2 = 'ac';
    $f3 = 'abc';

    $t1 = 'b';
    $t2 = 'a';
    $t3 = 'abc';

    // push to array
    $array_f[] = $f1;
    $array_f[] = $f2;
    $array_f[] = $f3;

    $array_t[] = $t1;
    $array_t[] = $t2;
    $array_t[] = $t3;

    // count($array_f) returns number of elements in array and array_unique removes duplicates from array
    // so if the length of original array is same as array without duplicates, then there weren´t duplicates else there were
    if(count($array_f) === count(array_unique($array_f))) echo 'array_t is unique return true</br>';
    else echo 'array_t is not unique return false</br>';

    if(count($array_t) === count(array_unique($array_t))) echo 'array_f is unique return true</br>';
    else echo 'array_ fis not unique return false</br>';

    ?>

答案 3 :(得分:0)

我认为去这里的方法是使用array_unique

<?php
$array = array($_POST['v1'], $_POST['v2'], $_POST['v3'], $_POST['v4'], $_POST['v5'], $_POST['v6']);
$array_unique = array_unique($array);

if ($array_unique == $array) {
    // No duplicates
} else {
    // duplicates
}
?>

编辑:如果您只想要非空的$_POST值:

<?php
$array = array();
if ($_POST['v1'] != '')
    $array[] = $_POST['v1'];
if ($_POST['v2'] != '')
    $array[] = $_POST['v2'];
if ($_POST['v3'] != '')
    $array[] = $_POST['v3'];
if ($_POST['v4'] != '')
    $array[] = $_POST['v4'];
if ($_POST['v5'] != '')
    $array[] = $_POST['v5'];
if ($_POST['v6'] != '')
    $array[] = $_POST['v6'];

if (count($array) < 2) {
    // Zero or one element in the array
} else {
    $array_unique = array_unique($array);

    if ($array_unique == $array) {
        // No duplicates
    } else {
        // duplicates
    }
}
?>

(当然,可以使用for循环增强阵列构建)

在此处查看:https://eval.in/683045

答案 4 :(得分:0)

$filtered = array_reduce(array_keys($_POST), function($carry, $key){
    // get all v[0..9]* variables from post
    if (preg_match('^/v\d+$/i',$key)) {
        $carry[$key]=$_POST[$key];
    }
    return $carry;
}, array());

$checked = array_unique($filtered);

$hasDuplicates = count($filtered) != count($checked);

另一个版本(如果你需要检查确切的POST键)

$keys = array('v1','v2','v3');
$filtered = array_intersect_keys($_POST, array_flip($keys));
$checked = array_unique($filtered);
$hasDuplicates = count($filtered) != count($checked);