Как заставить PHP использовать строки для ключей массива?

Я сталкивался со старым приложением, которое использует идентификатор для именования массива типа, например ...

array(1) {
  [280]=>
  string(3) "abc"
}

Теперь Мне нужно изменить их порядок, и var_dump () создаст впечатление, что этого не произойдет, пока ключи целые.

Если я добавлю a в каждый индекс, var_dump () будет показывать двойные кавычки вокруг ключа, я предполагаю, что теперь это строка ...

array(1) {
  ["280a"]=>
  string(3) "abc"
}

Это позволило бы мне легко переупорядочить их, не трогая больше кода.

Это не работает .

$newArray = array();
foreach($array as $key => $value) {
   $newArray[(string) $key] = $value;
}

A var_dump () по-прежнему показывает их как индексы целочисленных массивов.

Есть ли способ заставить ключи быть строками, чтобы я мог изменить их порядок без разрушения массива?

56
задан alex 6 January 2015 в 23:20
поделиться

3 ответа

РЕДАКТИРОВАТЬ :

Я предположил, что если они целые числа, я не могу переупорядочить их без изменения ключ (что важно в этом пример). Однако если бы они были струны, я могу переупорядочить их, как они вроде как индекс не должен быть интерпретируется как особый значение. Во всяком случае, см. Мой вопрос обновление того, как я это сделал (я спустился другой маршрут).

На самом деле они не должны быть в числовом порядке ...

array(208=>'a', 0=> 'b', 99=>'c');

Совершенно верно, если вы назначаете их вручную. Хотя я согласен, что целочисленные ключи могут быть неверно истолкованы как имеющие последовательное значение кем-то, хотя вы могли бы подумать, что если бы они были в нечисловом порядке, было бы очевидно, что это не так. Тем не менее, я думаю, что, поскольку у вас была возможность изменить код при обновлении, это лучший подход.


Возможно, не самый эффективный способ, но простой как пирог:

$keys = array_keys($data);

$values = array_values($data);
$stringKeys = array_map('strval', $keys);

$data = array_combine($stringKeys, $values);

//sort your data
8
ответ дан 26 November 2019 в 17:32
поделиться

как насчет этого?

$newArray = array();
foreach($oldArray as $key => $value) {
   $newArray[$key.''] = $value;
}

редактировать: попробовал и это тоже, и да, это не сработало.

Из документации PHP :

Ключ может быть целым или нить. Если ключ стандартный представление целого числа, это будет интерпретироваться как таковой (т.е. "8" будет интерпретируется как 8, а "08" будет интерпретируется как «08»). Плавает в ключе усекаются до целого числа. Нет разные индексированные и ассоциативные типы массивов в PHP; здесь только один тип массива, который может содержать целочисленные и строковые индексы.

Думаю, теперь это зависит от того, как вы хотите отсортировать массив. (окончательный результат?)

9
ответ дан 3 August 2019 в 08:19
поделиться

Edit: Это должно сработать

foreach($array as $key => $value) { 
    $newkey = sprintf('%s',$key);
    $newArray["'$newkey'"] = $value; 
} 
0
ответ дан 26 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

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