2017-03-13 70 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

得到了你的觀點,看起來不錯。 –

相關問題