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正在丢失这对我帮助很大!。非常感谢这对我的帮助!。谢谢