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.
Я думаю, это поможет вам.