1) Решительно пофигу, где используются кавычки - в массиве или где-то еще. При обращении к индексу массива $a["key"] в квадратные скобки попадает выражение "key", состоящее из одного строкового литерала. Кавычки - это не часть магии, достающей что-то из массива =) Так тоже можно:
$a = ['key' => 'val'];
$k = "key";
// вау! вот это магия!!!
echo $a[$k];
// просто невероятно!
echo $a[ strrev('ek') . substr($k, -1, 1) ];
2) По поводу "одинарные быстрее работают": надо понимать, за счет чего они "работают быстрее". Пхп пытается найти в них переменные и специальные последовательности типа \n
при разборе скрипта. То есть один раз в самом начале, а не каждый раз, когда выражение исполняется. То есть:
for ($i = 0; $i < 100500; $i++) {
$b = $a["key"];
}
Заменив тут двойные на одинарные, почувствовать разницу не получится, несмотря на длинный цикл. Ее можно почувствовать, если у вас очень очень очень большой php-файл.
3) И я вот решил наконец выяснить, какая она, это разница =)
<?php
$s = 'return count([';
ini_set('memory_limit', '900M');
$rands = [];
$num = 1000000;
$quot = '"';
// я турбо-кавычка!
// $quot = "'";
// ^ ^ ^ ^ ^
// раскомментируй меня и почувствуй настояющую скорость!
for ($i = 0; $i < $num; $i++) {
$s .= $quot. md5( rand(100000000, 999999999) . rand(100000000, 999999999) ).$quot.' => 1';
if ($i !== $num - 1) {
$s .= ',' ;
}
}
$s .= ']);';
// получилось строка:
// return count(['a' => 1, 'b' => 1, ... 1kk раз ])
$start = microtime(true);
// вот тут будет работать парсер
eval($s);
// например, 1.4128859043121 сек.
echo (microtime(true) - $start) . " сек.";
Мы генерим строку с кодом, который создает массив с миллионом ключей, каждый ключ - md5 от двух случайных чисел. eval запускает парсер и он типа 1.4128 сек отрабатывает.
Теперь раскомментируем одинарную кавычку, и видим... 1.2484261989594 сек.! То есть разница в 0.16 с на дичайшем и нереальнейшем примере =) Повторим 100 раз, у меня получилось в среднем 0.12 сек. в пользу одинарных. Это на маке с php 5.6. Погонял на VPS с php 7 - там разница 0.36 сек, но между отдельными замерами одинакового способа разброс получается сильно больше этих 0.36, так что не показательно.
4) Поэтому ориентироваться на "быстродействие" надо в последнюю очередь. На возможность вставлять переменные внутрь двойных кавычек ориентироваться тоже не надо, потому что так делать плохо, потому что читать сложнее, хорошо - закрыть кавычку, поставить точечку и дальше уже доллар (как эс) =)
В первую очередь надо ориентироваться на вероятность появления переносов строки, которые могут возникнуть в этой строке. Во вторую - на вероятность появления собственно кавычки одного из типов, потому что экранирование снижает читаемость (особенно если это регулярка, где сам слеш тоже надо экранировать). В остальных случаях можно юзать любую, но желательно одну и ту же. Например одинарную, потому что ее на клавиатуре нажимать удобнее =)