2016-11-16 3 views
-1

ein Array von Zahlen befindet sich:Filtern eines Array von Zahlen entsprechend einem numerischen Muster

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

und eine Variable (das Muster):

$input = 1231; 

würde Ich mag das Array filtern, mit die folgenden Regeln. Sei $list[$i] ein Gegenstand der $list Reihe, $d sei eine Ziffer von $list[$i]. Dann

  • , wenn die Anzahl der Ziffern gleich $d in $list[$i] größer ist als die Anzahl von Ziffern gleich $d in $input, dann ist das Array-Element übersprungen werden muß;
  • Wenn in $input keine $d Ziffer angegeben ist, muss das Array-Element übersprungen werden.

Zum Beispiel in den oben genannten $input variable

  • 1 erscheint zweimal,
  • 2 und 3 einmal erscheinen.

Dann alles, was mehr als das erscheint sollte aus dem Array entfernt werden:

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

Wie kann ich das erreichen?

+1

warum 111.112 .. entfernt werden sollte? –

+1

Sie könnten etwas mit [substr_count] (http://php.net/manual/en/functionsubstrocount.php) und [array_filter] (http://php.net/manual/en/function.array) versuchen -filter.php) –

+0

Warum in der Welt sollte '111' entfernt werden und' 123' bleibt? Was ist die Logik dahinter? Sie müssen uns den Grund angeben, nicht nur das gewünschte Ergebnis. – Irvin

Antwort

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

wow, das funktioniert perfekt !! Danke vielmals! –

-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

Das OP möchte die doppelten Zahlen entfernen, die in der Variable $ Input angegeben sind, nicht alle Einträge, die doppelte Zahlen enthalten. – jeroen

2

Bitte lassen Sie mich wissen, ob es funktioniert

$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

Warnung Fehlermeldung: strpos() erwartet Parameter 1 als String –

+0

wo Sie $ input deklariert –

+0

Jetzt haben: Warnung Fehlermeldung: Falsches Argument für Foreach() –

Verwandte Themen