2011-04-03 108 views
1

在PHP中的差異將更改應用於一個字符串,我有兩個字符串:基於從另一個

$str1 = 'amare'; 

......還有......

$str2 = 'laudare'; 

對於$ str2的,還有額外的形式是...

$form2 = 'laudant'; 

現在我想根據這是從$ STR2做$ Form2的變化產生$ Form1中(爲$ STR1):

laudare - > laudant =====>阿瑪雷 - > AMANT

你能幫助我建立一個函數,它不呢?

<?php 
function generateForm($str1, $str2, $form2) { 
    // 1) get the shared part of $str2 and $form2: "lauda" 
    // 2) extract the according part for $str1: "ama" 
    // 3) get the ending which has been suffixed: "nt" 
    // 4) add the ending from step 3 to the base from step 2: "amant" 
    // 5) return the string from step 4 
} 
?> 

如何在PHP中實現這一點?提前感謝!

+2

你肯定會更好試圖追查一個真正的拉丁語解析器,而不是在一起糾纏一個過於簡單的規則,只有在某些情況下才會起作用 – 2011-04-03 10:30:51

+0

感謝您的評論。正如我現在已經決定採用半自動方法,這正是我所需要的;)但是你是對的:對於自動拉丁語解析,這不會有用。 – caw 2011-04-03 10:39:37

+0

在這種情況下,你不能簡單地檢查第一個接合不定式「是」的結尾,並用「螞蟻」代替......或者將共軛傳遞給函數,而不是將另一個第一個接合動詞的不定式用作操作的一部分 – 2011-04-03 10:56:04

回答

1
function generateForm($str1, $str2, $form2) { 
$p1=str_split($str2); 
$p2=str_split($form2) ; 
$i=0; 
while($p1[$i]==$p2[$i]) 
{ 
    $i++ ; 
} 

$pre=strlen(substr($str2,$i)); 

$rep=substr($form2,$i); 
return substr($str1,0,(strlen($str1)-$pre)).$rep; 
} 

這將工作但不是所有的情況下

+0

非常感謝Muntasir! :)由於你的功能運作良好,它是更快的解決方案(對於100,000次運行,2.18秒對3.09秒),你的答案是最好的。 – caw 2011-04-04 14:06:42

+0

我忘了提及:你的解決方案非常短 - 精彩:) – caw 2011-04-04 14:11:14

0
<?php 

function generateForm($str1, $str2, $form2) { 
$str2Ar = preg_split('//', $str2, -1); 
$form2Ar = preg_split('//', $form2, -1); 
$match = ''; 
    foreach($str2Ar as $key=>$c) 
    { 
     if($c == $form2Ar[$key]) 
     $match .= $c; 
     else 
     break; 
    } 
    $pre = substr($str1,0,3); 
    $sufix = substr($form2,strlen($form2)-2,2); 
    $return_form = $match.$sufix; 
    $return_according = $pre.$sufix; 
    return array($return_form,$return_according); 

} 

$str1 = 'amare'; 
$str2 = 'laudare'; 
$form2 = 'laudant'; 

$result = generateForm($str1, $str2, $form2) ; 
    echo $result[0];//return form 
    echo "<hr>"; 
    echo $result[1];//return according 
+0

感謝您的努力和您的快速回復,但這對我無效。它給出了錯誤的結果。 – caw 2011-04-04 13:56:42

1

在這裏,你走了,但它只能工作,如果最後一個字母改變:

function generateForm($str1, $str2, $form2) { 
    $commonStr = ''; 
    for($i = 0;$i < strlen($str2); $i++){ 
     if($str2{$i} == $form2{$i}){ 
      $commonStr .= $str2{$i}; 
     } 
     else 
      break; 
    } 
    $suffix1 = substr($str2, strlen($commonStr)); 
    $suffix2 = substr($form2,strlen($commonStr)); 

    $str1common = substr($str1, 0, strlen($str1)-strlen($suffix1)); 

    return $str1common . $suffix2; 
} 
+0

謝謝你的回答:)它運作良好。但不幸的是,我不得不選擇其中一個答案是最好的。由於Muntasir的解決方案更快(2.10秒,3.09秒,100,000次運行),我選擇了他的答案。但再次感謝! – caw 2011-04-04 14:10:51