2012-07-10 3 views
0

Например:Поиск шаблонов в массиве PHP

основной массив является: array(0 => 'A', 1 => 'A', 2 => 'B', 3 => 'B', 4 => 'B');

картина: array('A', 'B');

ожидаемый ответ: array(array(0, 2), array(1, 3))

еще один пример:

основной массив array(0 => 'F', 5 => 'G', 78 => 'R', 2 => 'D');

узор array('G', 'R', 'F');

ожидаемый ответ: array(array(5, 78, 0))

Как я могу найти все вхождения шаблона в массиве?

+0

Что означает 'array (0, 2)' и 'array (1, 3)' mean? –

+0

@Rocket Я думаю, что более разумно думать о нем как о массиве ('A' => array (0, 2), 'B' => array (1, 3)) – sean

+0

@Rocket - это идентификаторы элементов, соответствующих шаблону , В примере есть две согласованные пары -> (0,2) (1,3) – Yekver

ответ

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')); 

DEMO: http://codepad.org/JCdsAMGk

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


} 
Смежные вопросы