2014-06-22 14 views
1

我想創建一個系統地修改音樂結構的方法。主要標度由數字1-7表示(以另一種方式表示爲C = 1,D = 3,E = 5,F = 6,G = 8,A = 10,B = 12,因爲所有相鄰音符除了EF和BC之外,其他音符之間有意外)。在另一個陣列中,可以在樂器上播放的每個音符的唯一ID編號所代表的一組音符每個都被分配一個1-7的概念功能。然後,通過將這組音符與下面的列表進行比較,我可以根據正在播放的音階調整音符,並向玩家展示如何播放所需結構。例如,mixolydian音階的第7個音符減1,而lydian音階的第4個音符增加1.(在上例中,這會將B從12改變爲11,或者將F從6改變爲7 )PHP:將兩個鍵分配給一個值;使2鍵有一個同義定義

$qualityDefinitions = array(
"major" => array(), //default, no changes 
"mixolydian" => array("7" => -1), //flat 7,etc 
"dorian" => array("3" => -1, "7" => -1), 
"aeolian" => array("3" => -1, "6" => -1, "7" => -1), 
"phyrgian" => array("2" => -1, "3" => -1, "6" => -1, "7" => -1), 
"lydian" => array("4" => 1), 
"locrian" => array("2" => -1, "3" => -1, "5" => -1, "6" => -1, "7" => -1) 
); 

但是,我希望能夠以同義的方式訪問存儲在這些數組鍵中的信息。例如,如果我想建立一個占主導地位的7和絃(有1,3,5,b7),我只需要修改mixolydian量表。但說和絃是「mixolydian」是不尋常的;它通常被描述爲「主導7」,「主宰7」或僅僅是「7」。

有沒有什麼辦法可以稍微改變我爲這個需求所使用的數據結構,這樣我就可以使用:$ qualityDefinitions ['dom7']和$ qualityDefinitions ['mixolydian']來訪問相同的定義,還是它簡而言之,我需要以一種概念上不同的方式思考這個問題,並對我的代碼進行重大更改? (作爲新手,我知道可能有一種更抽象和更有效的方式來做到這一點,這種方式現在略超出我的想象,但如果可能的話,我寧願這樣做。)

回答

1

您可以做到這一點後:

$qualityDefinitions["dominant 7"] = & $qualityDefinitions["mixolydian"]; 

這使得「顯性7」鍵參考(或者是同義詞)的「mixolydian」鍵。

如果你想輕鬆擁有這幾條讓你可以這樣做是這樣的:

$synonyms = array(
    "mixolydian" => array("dominant 7", "dom7", "7"), 
    "lydian" => array("whatever", "it's", "called"), 
); 

foreach ($synonyms as $k => $a) 
{ 
    foreach ($a as $v) 
     $qualityDefinitions[$v] = & $qualityDefinitions[$k]; 
} 
+1

謝謝!那就是訣竅。我相信最終我可以做到這一點(可能從一開始就改寫),但是這對我來說現在最適合我。 – AardvarkApostrophe

1

在我的理解,你需要一種方法來調用數組的相同元素與字符串類型的不同指數( )。

如果是這樣,你可以用索引值定義你的字符串。

例如,如果arr ['dominant']實際上意味着arr [0]。您可以定義爲「顯性」有在PHP這樣的數值0:

<?php 
    define("dominant",0); ?> 

現在你想要更多的字符串來表示相同的0指數像「顯性」。例如,現在你想'dom7','d7'被調用,這將指示相同的第0個索引。只需如下定義:

<?php 
     define("dominant",0); 
     define("dom7",0); // Newly added 
     define("d7",0); // Newly added 
?> 

現在,如果你回聲ARR [ 「顯性」],編曲[ 「dom7」]和ARR [ 「D7」],他們都將打印相同的值,因爲所有的他們索引爲0.

我想,這會幫助你。

+0

謝謝!這是非常有用的,很好的瞭解。 – AardvarkApostrophe

相關問題