gpt4 book ai didi

php - 如何强制 PHP 使用字符串作为数组键?

转载 作者:IT老高 更新时间:2023-10-28 12:08:40 26 4
gpt4 key购买 nike

我遇到过一个旧应用程序,它使用 id 来命名类型数组,例如...

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

现在我需要对它们重新排序,并且 var_dump() 会让人觉得当键是整数时不会发生这种情况。

如果我向每个索引添加一个 avar_dump() 将在键周围显示双引号,我猜它现在是一个字符串...

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

这让我可以轻松地重新排序它们,而无需修改更多代码。

不起作用

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

var_dump() 仍将它们显示为整数数组索引。

有没有办法强制键是字符串,这样我就可以在不破坏数组的情况下对它们重新排序?

最佳答案

你不能!!

Strings containing valid integers will be cast to the integer type. E.g. the key "8" will actually be stored under 8. On the other hand "08" will not be cast, as it isn't a valid decimal integer.

编辑:

真的可以!! Cast sequential array to associative array

$obj = new stdClass;
foreach($array as $key => $value){
$obj->{$key} = $value;
}
$array = (array) $obj;

在大多数情况下,以下引用是正确的:

Strings containing valid integers will be cast to the integer type. E.g. the key "8" will actually be stored under 8. On the other hand "08" will not be cast, as it isn't a valid decimal integer.

此示例来自 PHP 文档

 <?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>

上面的例子会输出:

array(1) {
[1]=> string(1) "d"
}

因此,即使您要创建一个带有编号键的数组,它们也只会被转换回整数。

不幸的是,我直到最近才意识到这一点,但我想我会分享我失败的尝试。

尝试失败

$arr = array_​change_​key_​case($arr); // worth a try. 

Returns an array with all keys from array lowercased or uppercased. Numbered indices are left as is.

我接下来的尝试是通过 array_combine 将旧值替换为新(字符串)键来创建新数组。

我尝试了几种方法使 $keys 数组包含字符串类型的数值。

range("A", "Z") 适用于字母表,所以我会尝试使用数字字符串。

$keys = range("0", (string) count($arr) ); // integers

这导致了一个充满键但都是 int 类型的数组。

这里有几个成功的尝试用字符串类型的值创建一个数组。

$keys = explode(',', implode(",", array_keys($arr))); // values strings

$keys = array_map('strval', array_keys($arr)); // values strings

现在只是将两者结合起来。

$arr = array_combine( $keys, $arr); 

这是我发现数字字符串被转换为整数的时候。

$arr = array_combine( $keys, $arr); // int strings
//assert($arr === array_values($arr)) // true.

将键更改为字符串并保持其字面值的唯一方法是在键前面加上一个带小数点的后缀 "00","01","02""0.","1.","2.".

您可以这样实现。

$keys = explode(',', implode(".,", array_keys($arr)) . '.'); // added decimal point 
$arr = array_combine($keys, $arr);

当然,这不太理想,因为您需要像这样定位数组元素。

$arr["280."]   

我创建了一个小函数,即使您只输入整数而不是新字符串,它也会以正确的数组元素为目标。

function array_value($array, $key){

if(array_key_exists($key, $array)){
return $array[ $key ];
}
if(is_numeric($key) && array_key_exists('.' . $key, $array)){
return $array[ '.' . $key ];
}
return null;
}

用法

echo array_value($array, "208"); // "abc"

编辑:

真的可以!! Cast sequential array to associative array

所有这些都是徒劳的

关于php - 如何强制 PHP 使用字符串作为数组键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com