根据数字模式筛选数字数组


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]的一个数字。

  • 如果$list[$i]中等于$d的数字数大于$input中等于$d的数字数,则必须跳过该数组项;
  • 如果$input中没有指定$d数字,则必须跳过该数组项。
例如,在上面提到的$input变量 中
  • 1出现两次,
  • 23出现一次

那么,所有出现的内容都应该从数组中删除:

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

我如何做到这一点?

请让我知道它是否有效

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