0

例えば:

主な配列は次のとおりです。array(0 => 'A', 1 => 'A', 2 => 'B', 3 => 'B', 4 => 'B');

パターンは次のとおりです。array('A', 'B');

予想される答え:array( array(0, 2), array(1, 3) )

もう1つの例:

メイン配列array(0 => 'F', 5 => 'G', 78 => 'R', 2 => 'D');

パターンarray('G', 'R', 'F');

予想される答え:array(array(5, 78, 0))

配列内のパターンのすべての出現を見つけるにはどうすればよいですか?

4

2 に答える 2

2

これは再帰を使用する関数です。

function array_pattern($array, $pattern){
    $ret = array(array());
    $found = true;
    foreach($pattern as $val){
        $x = array_search($val, $array);
        if($x === FALSE){
            $found = FALSE;
            break;
        }
        unset($array[$x]);
        $ret[0][] = $x;
    }
    return $found ? array_merge($ret, array_pattern($array, $pattern)) : array();
}

次のように呼び出します。

$a = array_pattern(array(0 => 'A', 1 => 'A', 2 => 'B', 3 => 'B', 4 => 'B'), array('A', 'B'));
$b = array_pattern(array(0 => 'F', 5 => 'G', 78 => 'R', 2 => 'D'), array('G', 'R', 'F'));

デモ: http://codepad.org/JCdsAMGk

于 2012-07-10T16:23:37.953 に答える
0

次のコードはテストしていませんが、アイデアが得られるかもしれません。

$arr = array(0 => 'A', 1 => 'A', 2 => 'B', 3 => 'B', 4 => 'B');
$test = array('G', 'R', 'F');

$count = 0;
$count2 = 0; 
for($i=0;$i<count($arr);$++){
    $pass= true;
    if(count($test)+$count <= count($arr)){
        for($k=0;$k<count($test);$k++){
            if($arr[k+i]!=$test[k]){
                  $pass = false;
            }
        }
    }else{
       $pass = false;
    }

     if($pass){
       $output[$count2] = $i;
       $count2++;
     }


}
于 2012-07-10T16:25:25.077 に答える