php preg match. Найти элементы с двумя значениями не по порядку - PullRequest
1 голос
/ 31 марта 2020

Я получил массив как:

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

Затем мне нужно найти, какие элементы имеют два числа. Значение числа может измениться.

Если значения были:

$n1 = 0; 
$n2 = 3;

Для этого поиска preg_match() должно вернуть (3200,0436)

Если значения были:

$n1 = 0; 
$n2 = 0;

preg_match() должен вернуть (0012,3200,9002)

Есть идеи?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Я получил ваши логики c после многократного просмотра вашего входного массива, а также вывода на основе заданных чисел.

Поскольку я не очень хорош в регулярном выражении, я буду go, чтобы узнать ответ с помощью общеизвестных PHP функций.

1.Создайте функцию, которая принимает начальный массив, а также эти поисковые числа в виде массива (так, чтобы Вы можете искать любое число и любую длину чисел).

2. Теперь выполните итерацию по исходному массиву, разделите каждое значение для преобразования в массив и выполните array_count_value() как для массива разбиения, так и для массива чисел. Теперь применить проверку и увидеть точное совпадение найдено или нет?

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

Выход: https://3v4l.org/7uWfC А https://3v4l.org/Tuu5m А https://3v4l.org/fEKTO

1 голос
/ 31 марта 2020

Вместо использования preg_match вы можете использовать preg_grep и динамически создавать шаблон, который будет соответствовать 2 значениям в каждом порядке, используя чередование .

^[A-Z0-9]*0[A-Z0-9]*3[A-Z0-9]*|[A-Z0-9]*3[A-Z0-9]*0[A-Z0-9]*$

Класс символов [A-Z0-9] соответствует либо символу AZ, либо ди git 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
)
...