【问题标题】:PHP: Assign Two Keys to One Value; make 2 keys have a synonymous definitionPHP:将两个键分配给一个值;使 2 个键具有同义定义
【发布时间】:2014-06-22 04:53:36
【问题描述】:

我正在尝试创建一种系统地修改音乐结构的方法。大调由数字 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 .)

$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”是不寻常的;它更常被描述为“dominant 7”、“dom7”或仅仅是“7”。

有什么方法可以稍微改变我正在使用的数据结构来满足这个需求,这样我就可以访问相同的定义:$qualityDefinitions['dom7'] 和 $qualityDefinitions['mixolydian'],或者仅仅是我需要以概念上不同的方式考虑这个问题并对我的代码进行重大更改? (作为一个新手,我知道现在可能有一种更抽象、更有效的方法来做到这一点,这有点超出我的想象,但如果可能的话,我更愿意这样做。)

【问题讨论】:

    标签: php arrays theory


    【解决方案1】:

    您可以在之后执行此操作:

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

    这使得“dominant 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];
    }
    

    【讨论】:

    • 谢谢!那成功了。我确信最终我可以用一种不那么冗长的方式来做到这一点(也许从头开始重写),但目前这对我来说效果最好。
    【解决方案2】:

    据我了解,您需要一种方法来调用具有不同索引(字符串类型)的数组的相同元素。

    如果是这样,您可以使用索引值定义字符串。

    例如,如果 arr['dominant'] 的意思实际上是 arr[0]。您可以在 php 中将 'dominant' 定义为具有这样的值 0:

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

    现在您需要更多的字符串来表示相同的 0 索引,例如“显性”。例如,现在您希望调用“dom7”、“d7”,这将指示相同的第 0 个索引。简单定义如下:

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

    现在,如果你回显 arr["dominant"]、arr["dom7"] 和 arr["d7"],它们都将打印相同的值,因为它们都索引为 0。

    我想,这会对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2018-09-23
      • 1970-01-01
      相关资源
      最近更新 更多