Массивный оператор с фигурными скобками - какова цель?

Я нашел этот фрагмент кода онлайн, и мне было интересно, что он делает:

$k[$i] = ord($key{$i}) & 0x1F;

Я знаю, что ord() возвращает значение ASCII, но я не понимаю, что фигурные скобки делают $key{$i}, а также то, что это делает & 0x1F.

Ответ 1

Это не синтаксис массива. Он предназначен для доступа к одиночным символам только из строк. Индекс должен быть числовым.

 $str{1} == $str[1]

Он кратко упоминается здесь в информационном окне: http://www.php.net/manual/en/language.types.string.php#language.types.string.substr

Кроме того, он официально объявлен устаревшим. Он был включен и отключен, предположительно, в руководстве, но по-прежнему очень важен, если необычный синтаксис.


& 0x1F - бит-бит И. В этом случае он ограничивает десятичные значения от 0 до 31.

Ответ 2

Первая часть вашего вопроса: фигурные скобки

Это касается ссылки на значение переменной.

В вашем примере, если $i равно 123, тогда

$k[$i] = ord($key{$i}) & 0x1F;

будет таким же, как

$k[123] = ord($key[123]) & 0x1F;

Вторая часть вашего вопроса: '&' знак

& является двоичным оператором. Подробнее в документации. Он устанавливает биты, если они установлены в обеих переменных.

Ответ 3

В PHP либо [квадратные скобки], либо {фигурные скобки} являются полностью законными, взаимозаменяемыми средствами доступа к массиву:

Примечание. Оба квадратных скобки и фигурные скобки могут использоваться взаимозаменяемо для доступа к элементам массива (например, $array [42] и $array {42} будут делать то же самое в примере выше).

Источник: http://www.php.net/manual/en/language.types.array.php

Оба являются полностью действительными; фигурные скобки не устарели.

Относительно "& 0x1F" другие, такие как @Tadek, ответили:

& является бинарным оператором. Подробнее см. В документации [http://www.php.net/manual/en/language.operators.bitwise.php]. Он устанавливает биты, если они установлены в обеих переменных.

Ответ 4

& 0x1F - это побитовая операция, используемая для "нормализации" значений символов, цветов и т.д., которые помещаются в шестнадцатеричные, но не обязательно "читаются" одинаково. Подробнее о Wikipedia здесь.

& 0x1f

эквивалентно

& 00011111

Это может эффективно установить первые три бита любого значения размера байта в 0.

0xff & 0x1f

приводит к

0x1f

или

11111111 & 00011111

приводит к

00011111