Фильтрация массива чисел по числовому шаблону

Есть массив чисел:

$list = array
(
[0] => 111
[1] => 112
[2] => 113
[3] => 114
[4] => 121
[5] => 122
[6] => 123
[7] => 124
[8] => 131
[9] => 132
[10] => 1234
[11] => 1123
[12] => 1223
[13] => 1233
[14] => 4321
)

и переменная (шаблон):

$input = 1231;

Я хотел бы отфильтровать массив по следующим правилам. Позволять $list[$i] быть предметом $list массив, $d быть цифрой $list[$i], затем

  • если количество цифр равно $d в $list[$i] больше, чем количество цифр, равное $d в $inputтогда элемент массива должен быть пропущен;
  • если нет $d цифра указана в $input, тогда элемент массива должен быть пропущен.

Например, в вышеупомянутом $input переменная

  • 1 появляется дважды,
  • 2 а также 3 появиться один раз.

Тогда все, что появляется больше, чем это должно быть удалено из массива:

$list = array
(
[0] => 111  ==> should be removed (1 is only defined twice in $input, so it shouldn't appear more than twice)
[1] => 112
[2] => 113
[3] => 114  ==> should be removed (there is no 4)
[4] => 121
[5] => 122  ==> should be removed (2 is only defined once, so it shouldn't appear more than once)
[6] => 123
[7] => 124  ==> should be removed (there is no 4)
[8] => 131
[9] => 132
[10] => 1234  ==> should be removed (there is no 4)
[11] => 1123
[12] => 1223  ==> should be removed (2 is only defined once in $input, so it shouldn't appear more than once)
[13] => 1233  ==> should be removed (3 is only defined once in $input, so it shouldn't appear more than once)
[14] => 4321  ==> should be removed (there is no 4)
)

Как мне этого добиться?

-1

Решение

// Prepare counters for the digits in $input
foreach (str_split((string)$input) as $d)
@$counters[$d]++;

$result = [];

foreach ($list as $key => $n) {
// Counter for digits in $n
$tmp_counter = [];

foreach (str_split((string)$n) as $d) {
// $d is not specified in $input, so skip $n
if (empty($counters[$d]))
continue 2;

// The number of $d entries in $n is greater than
// it is specified in $input, so skip $n
if (@++$tmp_counter[$d] > $counters[$d])
continue 2;
}

$result[$key] = $n;
}
1

Другие решения

Пожалуйста, дайте мне знать, если это работает

$input = 1123;
$output = array(111,112,113,114,121,122,123,124,131,132, 1234, 1123, 1223, 1233, 4321);
$count = count_chars($input, 1);
$result = array_filter($output, function($n) use($input, $count) {
foreach(count_chars($n, 1) as $i => $val) {
if(strpos($input, $i) === false) {
return 0;
}else if($val > $count[$i]){
return 0;
}
}
return 1;
});
2

    For that you can check count of array by splinting and array_unique methode of PHP.$main_arr = array(111,112,113,114,121,122,123,124,131,132,1234,1123,1223,1233,4321);

$ans = [];
foreach ($main_arr as $value){
$sub_arr = str_split($value);
if(count($sub_arr) == count(array_unique($sub_arr))){
array_push($ans,$value);
}
}
print_r($ans);

This will output:

Array (
[0] => 123
[1] => 124
[2] => 132
[3] => 1234
[4] => 4321
)

Thanks
-1
По вопросам рекламы [email protected]