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

#php #arrays #theory

#php #массивы #теория

Вопрос:

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

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

Ответ №1:

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

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

Комментарии:

1. Спасибо! это сделало свое дело. Я уверен, что в конечном итоге есть менее подробный способ, которым я мог бы это сделать (возможно, переписав с самого начала), но на данный момент это работает лучше всего для меня.

Ответ №2:

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

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

Например, если arr[‘dominant’] на самом деле означает arr[0] . Вы можете определить «доминирующий», чтобы иметь значение 0, подобное этому в php:

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

Теперь вы хотите, чтобы больше строк указывали на тот же индекс 0, что и ‘dominant’. Например, теперь вы хотите, чтобы вызывались ‘dom7’, ‘d7’, которые будут указывать на тот же 0-й индекс. Просто определите, как показано ниже:

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

Теперь, если вы повторяете arr[«dominant»] , arr[«dom7»] и arr[«d7»] , все они будут печатать одно и то же значение, потому что все они индексируются на 0.

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