Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php预匹配。查找两个值不按顺序排列的元素_Php_Preg Match - Fatal编程技术网

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

php预匹配。查找两个值不按顺序排列的元素,php,preg-match,Php,Preg Match,我得到的数组是: $array = array( 3A32, 4565, 7890, 0012, A324, 9002, 3200, 345A, 0436 ); 然后我需要找出哪些元素有两个数字。数字的值可以更改 如果值为: $n1 = 0; $n2 = 3; $n1 = 0; $n2 = 0; 对于该搜索,preg_match应返回32000436 如果值为: $n1 = 0; $n2 = 3; $n1 =

我得到的数组是:

$array = array(
    3A32,
    4565,
    7890,
    0012,
    A324,
    9002,
    3200,
    345A,
    0436
);
然后我需要找出哪些元素有两个数字。数字的值可以更改

如果值为:

$n1 = 0; 
$n2 = 3;
$n1 = 0; 
$n2 = 0;
对于该搜索,preg_match应返回32000436

如果值为:

$n1 = 0; 
$n2 = 3;
$n1 = 0; 
$n2 = 0;
preg_match应返回001232009002

有什么想法吗


谢谢。

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

因为我对正则表达式一点也不在行,所以我将使用常见的PHP函数来找出答案

1.创建一个函数,该函数采用初始数组以及数组形式中的搜索数字,以便您可以搜索任意数字和任意长度的数字

2.现在迭代初始数组,拆分每个值以转换为数组,并对拆分数组和数字数组执行数组\计数\值。现在应用检查并查看是否找到精确匹配

3.将此匹配项分配给函数本身下声明的新数组

4.在函数末尾返回此数组

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

输出:和

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

因为我对正则表达式一点也不在行,所以我将使用常见的PHP函数来找出答案

1.创建一个函数,该函数采用初始数组以及数组形式中的搜索数字,以便您可以搜索任意数字和任意长度的数字

2.现在迭代初始数组,拆分每个值以转换为数组,并对拆分数组和数字数组执行数组\计数\值。现在应用检查并查看是否找到精确匹配

3.将此匹配项分配给函数本身下声明的新数组

4.在函数末尾返回此数组

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

输出:和

而不是使用preg_match,您可以使用并动态创建一个模式,该模式将使用

字符类[A-Z0-9]与字符A-Z或数字0-9匹配

|

如果要使用其他字符,还可以查看如何处理正则表达式字符

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
)

与使用preg_match不同,您可以使用并动态创建一个模式,该模式将使用

字符类[A-Z0-9]与字符A-Z或数字0-9匹配

|

如果要使用其他字符,还可以查看如何处理正则表达式字符

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
)

为什么不在$n1=0时使用9002$n2=3;?0012本身将变成12。这里不是很好地描述了$n1,$n2的概念吗?请考虑像$array=array'3A32','4565','7890','0012','A324','9002','3200','345A','0436'这样的数组;Preg match应该找到同时包含$n的元素,然后当$n1=0时$n2=3不在9002中,3在$n1=0时为什么不在9002中$n2=3;?0012本身将变成12。这里不是很好地描述了$n1,$n2的概念吗?请考虑像$array=array'3A32','4565','7890','0012','A324','9002','3200','345A','0436'这样的数组;Preg match应该找到同时包含$n的元素,然后当$n1=0时$n2=3不在9002中3正在丢失这对我帮助很大!。非常感谢这对我的帮助!。谢谢