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

时间:2016-11-16 08:15:01

标签: php arrays repeat

有一系列数字:

$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出现两次,
  • 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)
)

我如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

如果有效,请告诉我

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

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

    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