2016-11-16 51 views
-1

一个数字的阵列有数字数组:过滤根据数值图形

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

    如何实现这一点:

然后在出现比这更应该一切从阵列中删除?

+1

为什么111,112 ..应该被删除? –

+1

你可以尝试[substr_count](http://php.net/manual/en/function.substr-count.php)和[array_filter](http://php.net/manual/en/function.array -filter.php) –

+0

为什么在世界范围内'111'应该被移除并且'123'停留?这背后的逻辑是什么。你需要告诉我们的原因不只是你想要的结果。 – Irvin

回答

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; 
} 
+0

哇,这完美的作品!非常感谢! –

-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 
+0

OP要删除'$ input'变量中给出的重复数字,而不是所有重复数字的条目。 – jeroen

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; 
}); 
+0

警告错误消息:strpos()期望参数1为字符串 –

+0

您声明的$输入 –

+0

现在明白了:警告错误消息:为foreach提供的无效参数() –