根据数字模式过滤数字数组

Filtering an array of numbers according to a numeric pattern

有一个数字数组:

$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] 的数字。那么

例如上述$input变量中

那么所有出现超过这个的都应该从数组中删除:

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

我该如何实现?

    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

如果有效请告诉我

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