Задать вопрос
PegasBY
@PegasBY
Старый, уставший вебмастер...

Как получить доступ к символам элемента массива?

При переводе сайта с версии 5.6 на 7.4 столкнулся с ошибкой:

Deprecated: Array and string offset access syntax with curly braces is deprecated


Есть функция, сокращающая hex color до 3-х символов, если это возможно, вот её часть:
// $x - это массив, который вида $x[[0] => '#ff069f', [1] => '#FF0000', [2] => '#009900'];
 $hex =(($x[1]{0} == $x[1]{1}) && ($x[1]{2} == $x[1]{3}) && ($x[1]{4} == $x[1]{5})) ? '#'.$x[1]{0}.$x[1]{2}.$x[1]{4} : $x[1];


В PHP версии 5.6, обращения к символам переменной выполнялось таким образом:
$x = '#FF5577';
echo $x{4}; 
// 5


В версии 7.4 уже так:
$x = '#FF5577';
echo $x[4];
// 5


Но что делать если мы обращаемся не к переменной, а а элементу массива:
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
echo $x[1]{4};
// Deprecated: Array and string offset access syntax with curly braces is deprecated in 
// Notice: Undefined offset: 4
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@dzhebrak
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
print($x[1][0][4]);

В вашем примере каждому ключу массива соответствует не строка, а массив, поэтому сначала нужно получить нулевой элемент соответствующего массива, а затем уже определенный символ из этой строки.

И учитывайте важное уточнение от Rsa97 насчет байтов и символов. В случае с цветами проблемы не будет, но для кириллицы возникнет. Универсальным вариантом для разбития строки на массив символов будет использование функции mb_str_split
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
print_r(mb_str_split($x[1][0])[4]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас элементы основного массива тоже являются массивами. Вот вам и выдаёт ошибку, что в массиве нет элемента с индексом 4. А при замену фигурных скобок на квадратные - это пока только предупреждение.
$x = [0 => ['#ff069f'], 1 => ['#FF5500'], 2 => ['#009900']];
echo $x[1][0][4];
// 5

И это обращение не к символу, а к байту, что не всегда одно и то же.
$x = "Привет!";
echo $x[0];
// �
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы