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。
如果你想使用其他字符,你也可以看看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
)
我有这样的数组:
$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。
如果你想使用其他字符,你也可以看看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
)