Можно ли использовать числовую строку, например, "123"
в качестве ключа в массиве PHP, без ее преобразования в целое число?
$blah = array('123' => 1);
var_dump($blah);
печатает
array(1) {
[123]=>
int(1)
}
я хочу
array(1) {
["123"]=>
int(1)
}
"123"
==123
почти для всех целей. По какой причине вы хотите, чтобы он был именно строкой (а иметь int - это плохо)?array_merge
«Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущее. Однако если массивы содержат числовые ключи , более позднее значение не будет перезаписать исходное значение, но будет добавлено ".asort
Ответы:
Нет; нет, это не так:
Из руководства :
Дополнение
Из-за комментариев ниже я подумал, что было бы забавно указать, что поведение похоже, но не идентично ключам объектов JavaScript.
источник
Да, это возможно путем преобразования
stdClass
объекта в массив :Это дает вам (до версии PHP 7.1):
(Обновление: мой первоначальный ответ показал более сложный способ использования
json_decode()
иjson_encode()
что не нужно.)Обратите внимание на комментарий : к сожалению, невозможно напрямую ссылаться на значение:
$data['12']
приведет к уведомлению.Обновление :
с PHP 7.2 также можно использовать числовую строку в качестве ключа для ссылки на значение:
источник
echo $data['12'];
. Будет выдана ошибка «Примечание: неопределенное смещение: 12 дюймов - в строке 5».array_key_exists
, и в старых версиях не найду.Если вам нужно использовать числовой ключ в структуре данных php, объект будет работать. А объекты сохраняют порядок, поэтому вы можете выполнять итерацию.
источник
array()
, поэтому я предполагаю, что в этом контексте строки, определяющие допустимые целые числа, будут преобразованы в целочисленный тип. Но оказывается, что есть другие способы создания массивов, где этого не происходит, например, в ответе Дэвида, который я проверил.Мое решение:
Пробел char (prepend) - хорошее решение, потому что сохраните преобразование int:
Вы увидите 55 как int.
источник
"0$id" => $value
. Подготовка0
тоже работает.Вы можете привести ключ к строке, но в конечном итоге он будет преобразован в целое число из-за свободной типизации PHP. Посмотреть на себя:
Из руководства PHP:
источник
[42 => 'answer', 'snafu' => 'fubar']
У меня была эта проблема при попытке объединить массивы, которые имели как строковые, так и целочисленные ключи. Было важно, чтобы целые числа также обрабатывались как строка, поскольку это были имена для полей ввода (например, размеры обуви и т. Д.)
Когда я использовал
$data = array_merge($data, $extra);
PHP, ключи менялись. При попытке упорядочить целочисленные ключи (я пробовал с6
-'6'
-"6"
даже в(string)"6"
качестве ключей) были переименованы с 0 наn
... Если подумать, в большинстве случаев это было бы желаемым поведением.Вы можете обойти это, используя
$data = $data + $extra;
вместо этого. Довольно прямолинейно, но сначала я не подумал об этом ^^.источник
НЕПРАВИЛЬНО
У меня есть функция литья, которая обрабатывает последовательное преобразование в ассоциативный массив,
источник
В качестве обходного пути вы можете закодировать массив PHP в объект json с опцией JSON_FORCE_OBJECT.
т.е. этот пример:
приведет к:
источник
Я столкнулся с этой проблемой в массиве с ключами '0' и ''. Это означало, что я не мог проверить свои ключи массива с помощью == или ===.
Обходной путь - преобразовать ключи массива обратно в строки перед использованием.
источник
Что касается решения @david, обратите внимание, что когда вы пытаетесь получить доступ к строковым значениям в ассоциативном массиве, числа не будут работать. Я предполагаю, что они приводятся к целым числам за кулисами (при доступе к массиву), и значение не найдено. Доступ к значениям в виде целых чисел тоже не сработает. Но вы можете использовать array_shift () для получения значений или итерации массива.
источник
"0"
делается0
с php7.2.10
.У меня возникла эта проблема при попытке отсортировать массив, где мне нужно, чтобы ключ сортировки был шестнадцатеричным sha1. Когда в результирующем значении sha1 нет букв, PHP превращает ключ в целое число. Но мне нужно было отсортировать массив по относительному порядку строк. Поэтому мне нужно было найти способ заставить ключ быть строкой без изменения порядка сортировки.
Глядя на диаграмму ASCII ( https://en.wikipedia.org/wiki/ASCII ), восклицательный знак сортируется примерно так же, как пробел, и определенно ниже, чем все числа и буквы.
Поэтому я добавил восклицательный знак в конце ключевой строки.
источник