2012-09-29 150 views
0

我試圖做和絃轉位和絃PHP的值數組作爲跟隨...PHP - 字符串替換

$chords1 = array('C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C'); 

一個例子是D6/F#。我想匹配數組值,然後將其轉置數組中的給定數字位置。以下是我迄今爲止...

function splitChord($chord){ // The chord comes into the function 
    preg_match_all("/C#|D#|F#|G#|A#|Db|Eb|Gb|Ab|Bb|C|D|E|F|G|A|B/", $chord, $notes); // match the item 
    $notes = $notes[0]; 
    $newArray = array(); 
    foreach($notes as $note){ // for each found item as a note 
     $note = switchNotes($note); // switch the not out 
     array_push($newArray, $note); // and push it into the new array 
    } 
    $chord = str_replace($notes, $newArray, $chord); // then string replace the chord with the new notes available 
    return($chord); 
} 
function switchNotes($note){ 
    $chords1 = array('C','C#','D','D#','E','F','F#','G','G#','A','A#','B','C','Db','D','Eb','E','F','Gb','G','Ab','A','Bb','B','C'); 

    $search = array_search($note, $chords1);////////////////Search the array position D=2 & F#=6 
    $note = $chords1[$search + 4];///////////////////////then make the new position add 4 = F# and A# 
    return($note); 
} 

這工作,但問題是,如果我使用一個分裂的和絃像(D6/F#)弦被置換爲A#6/A#。它用(F#)代替第一個音符(D),然後用(A#)代替兩個(F#)。

問題是......我怎樣才能避免這種冗餘發生。期望的輸出將是F#6/A#。感謝您的幫助。如果解決方案已發佈,我會將其標記爲已回答。

回答

1

可以使用preg_replace_callback函數

function transposeNoteCallback($match) { 
    $chords = array('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', 'C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B', 'C'); 
    $pos = array_search($match[0], $chords) + 4; 
    if ($pos >= count($chords)) { 
     $pos = $pos - count($chords); 
    } 
    return $chords[$pos]; 
} 

function transposeNote($noteStr) { 
    return preg_replace_callback("/C#|D#|F#|G#|A#|Db|Eb|Gb|Ab|Bb|C|D|E|F|G|A|B/", 'transposeNoteCallback', $noteStr); 
} 

測試

回波transposeNote( 「EB6了Bb乙抗體D6/F#」);

回報

G6 C#的Eb全稱#6/A#

+0

我怎麼能一個變量添加到回調數... 4 –

+0

我不明白的問題。 你想檢測G#4,G#6,G#7嗎? 試試這個僞正則表達式「/...|(G#)([0-9]+)?|.../」 或者如果你不想不存在的和絃,你可以手動放置所有的變化「/ .. 。|(G#)(4 | 6 | 7 ... | 11 | ...)?| ... /「 在轉置NoteCallback中,您將在$ match [1] G中有,然後您必須檢查如果計數($匹配)== 2,如果條件爲真,您可以從$匹配[2] – Igor

+0

挑選號碼我終於得到了我所需要的。謝謝!我想要檢測它是否是#鍵或b鍵而不是音符檢測。 –

1

便宜的建議:移動到自然數域[[0-11]],並在顯示時間將它們與相應的註釋相關聯,它會爲您節省很多時間。

唯一的問題是同音發音[例如C-sharp/D-flat],但希望你能從音調中推斷出它。