PHP: назначить два ключа одному значению; сделать 2 ключа имеют синоним

Я пытаюсь создать способ систематического изменения музыкальных структур. Основная шкала представлена ​​числами 1-7 (которые представлены по-другому: C=1, D=3, E=5, F=6, G=8, A=10, B=12, потому что все соседние примечания пары, кроме EF и BC, имеют случайную связь между ними.) В другом массиве каждому из наборов нот, представленных уникальными идентификационными номерами для каждой ноты, которую можно сыграть на инструменте, присваивается концептуальная функция от 1 до 7. Затем, сравнивая этот набор нот с приведенным ниже списком, я могу настроить фактические ноты в соответствии с тем, какой масштаб воспроизводится, и показать игроку, как играть желаемую структуру. Например, седьмая нота миксолидийской шкалы уменьшается на 1, а четвертая нота лидийской шкалы увеличивается на 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"; чаще всего его называют "доминантный 7", "дом7" или просто "7".

Есть ли способ немного изменить структуру данных, которую я использую для этой цели, чтобы я мог получить доступ к одному и тому же определению с помощью: $qualityDefinitions['dom7'] и $qualityDefinitions['mixolydian'], или это просто тот случай, когда Мне нужно думать об этом концептуально и вносить существенные изменения в мой код? (Будучи новичком, я осознаю, что, возможно, существует более абстрактный и более эффективный способ сделать это, который сейчас немного выше моего воображения, но, если это возможно, я бы предпочел сделать это таким образом.)

2 ответа

Решение

Вы можете сделать это после:

$qualityDefinitions["dominant 7"] = & $qualityDefinitions["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];
}

В моем понимании вам нужен способ для вызова одного и того же элемента массива с другим индексом (строкового типа).

Если это так, вы можете определить свои строки с индексом значения.

Например, если arr['dominant'] означает фактически arr[0]. Вы можете определить "доминантный", чтобы он имел значение 0 в php:

<?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.

Я думаю, это поможет вам.

Другие вопросы по тегам