php 预匹配。查找具有两个值不按顺序排列的元素

php preg match. Find elements with two values not in order

我有这样的数组:

$array = array(
    3A32,
    4565,
    7890,
    0012,
    A324,
    9002,
    3200,
    345A,
    0436
);

然后我需要找出哪些元素有两个数字。数字的值可以改变。

如果值为:

$n1 = 0; 
$n2 = 3;

对于该搜索 preg_match() 应该 return (3200,0436)

如果值为:

$n1 = 0; 
$n2 = 0;

preg_match() 应该 return (0012,3200,9002)

有什么想法吗?

谢谢。

在多次查看您的输入数组以及基于给定数字的输出后,我明白了您的逻辑。

因为我对正则表达式一窍不通,我就去找大家熟知的答案PHP 函数。

1.Create 一个函数,它接受初始数组以及数组形式的搜索数字(以便您可以搜索任何数字和任何长度的数字)。

2.Now 遍历初始数组,拆分每个值以转换为数组,并对拆分数组和数字数组执行 array_count_value()。现在应用检查并查看是否找到完全匹配项?

3.Assign 这与在函数本身下声明的新数组相匹配。

4.Return 这个数组在函数的最后。

$n1 = 0; 
$n2 = 0;

function checkValues($array,$numbers=array()){
    $finalArray = [];
    if(!empty($numbers)){
        foreach($array as $arr){
            $splitArr = str_split($arr);
            $matched = true;
            $count_number_Array = array_count_values($numbers);
            $count_split_array = array_count_values($splitArr);
            foreach($count_number_Array as $key=>$value){
                if(!isset($count_split_array[$key]) || $count_split_array[$key] < $value){
                    $matched = false;
                    break;
                }
            }
            if($matched === true){
                $finalArray[] = $arr;
            }

        }

    }

    return $finalArray;
}

print_r(checkValues($array, array($n1,$n2)));

输出:https://3v4l.org/7uWfC And https://3v4l.org/Tuu5m And https://3v4l.org/fEKTO

您可以使用 preg_grep and dynamically create a pattern that will match the 2 values in each order using an alternation.

而不是 preg_match
^[A-Z0-9]*0[A-Z0-9]*3[A-Z0-9]*|[A-Z0-9]*3[A-Z0-9]*0[A-Z0-9]*$

字符 class [A-Z0-9] 匹配字符 A-Z 或数字 0-9。

Regex demo | Php demo

如果你想使用其他字符,你也可以看看preg_quote来处理正则表达式字符。

function getElementWithTwoValues($n1, $n2) {
    $pattern = "/^[A-Z0-9]*{$n1}[A-Z0-9]*{$n2}[A-Z0-9]*|[A-Z0-9]*{$n2}[A-Z0-9]*{$n1}[A-Z0-9]*$/";
    $array = array(
        "3A32",
        "4565",
        "7890",
        "0012",
        "A324",
        "9002",
        "3200",
        "345A",
        "0436"
    );

    return preg_grep($pattern, $array);
}

print_r(getElementWithTwoValues(0, 3));
print_r(getElementWithTwoValues(0, 0));

输出

Array
(
    [6] => 3200
    [8] => 0436
)
Array
(
    [3] => 0012
    [5] => 9002
    [6] => 3200
)