2017-03-13 69 views
2

我有一个数组来查找字母序列,然后获取最后一个和第一个组合。我正在尝试这样的事情。查找数组中的第一个和最后一个匹配序列php

$aarr = ['x','y','z','t','m','n','x','y','z']; 
$str = implode('',$aarr); 
$all_subset = powerSet($aarr); 
foreach ($all_subset as $set) { 
    $sre_temp = implode('', $set); 
    $tru = hasOrderedCharactersForward($sre_temp); 
    if($tru){ 
    echo $sre_temp.'<br>'; 
    } 
} 

function powerSet($array) { 
    // add the empty set 
    $results = array(array()); 

    foreach ($array as $element) { 
     foreach ($results as $combination) { 
      $results[] = array_merge(array($element), $combination); 
     } 
    } 

    return $results; 
} 
function hasOrderedCharactersForward($str, $i = 2) { 
     $alpha = 'abcdefghijklmnopqrstuvwxyz'; 
     $len = strlen($str); 

     for($j=0; $j <= $len - $i; $j++){ 
      if(strrpos($alpha, substr($str, $j, $i)) !== false){ 
       return true; 
      } 
     } 

     return false; 
} 

我觉得powerSet()工作不一样,我认为。即使它应该显示'xyz'的组合,但它不是;

+0

所以你希望'xyz'作为这个例子中的第一个和最后一个结果? – JustOnUnderMillions

回答

1

看看这个,如果它适合你的需要,使用它。

$aarr = ['x','y','z','t','m','n','x','y','z']; 
$subsets = []; 
$i=0; 
#here we merge all chars to sub-sequence 
foreach($aarr as $k=>$v){ 
    $subsets[$i][]=$v; 
    if(isset($aarr[$k+1]) && ord($v)+1!==ord($aarr[$k+1])){ 
     $i++; 
    } 
} 
$subsets = array_map(function($a){ return implode('',$a);},$subsets); 
print_r($subsets); 

结果:

阵列([0] => XYZ [1] => T [2] => MN [3] => XYZ)

获取第一和最后一个值:

#get first 
$first=null; 
$i=0; 
do{ 
    if(strlen($subsets[$i])>1){#find sequence 
     $first = $subsets[$i]; 
    } 
    $i++; 
}while(!$first && isset($subsets[$i])); 
#get last 
$last=null; 
$i=count($subsets)-1; 
do{ 
    if(strlen($subsets[$i])>1){#find sequence 
     $last = $subsets[$i]; 
    } 
    $i--; 
}while(!$last && isset($subsets[$i])); 
print "$first, $last"; 

结果:

xyz,xyz

+0

为什么't'在那里 –

+1

@Adeel Gill在结果中,所有后面的字符合并为一个字符串,而't'没有下面的字符,所以他会一个人留下。我没有删除任何东西,我只是合并可以合并的东西。下一步将获得第一个和最后一个。 – JustOnUnderMillions

+0

得到了你的观点,看起来不错。 –

相关问题