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

如何强制PHP使用字符串作为数组键?,php,arrays,Php,Arrays,我遇到了一个使用id命名类型数组的旧应用程序,例如 array(1) { [280]=> string(3) "abc" } 现在我需要对这些进行重新排序,var\u dump()会使键是整数时,这似乎不会发生 如果我在每个索引中添加一个a,var\u dump()将在键周围显示双引号,我猜现在显示它是一个字符串 array(1) { ["280a"]=> string(3) "abc" } 这将使我能够轻松地对它们进行重新排序,而不必接触更多的代码 这不起作用

我遇到了一个使用id命名类型数组的旧应用程序,例如

array(1) {
  [280]=>
  string(3) "abc"
}
现在我需要对这些进行重新排序,
var\u dump()
会使键是整数时,这似乎不会发生

如果我在每个索引中添加一个
a
var\u dump()
将在键周围显示双引号,我猜现在显示它是一个字符串

array(1) {
  ["280a"]=>
  string(3) "abc"
}
这将使我能够轻松地对它们进行重新排序,而不必接触更多的代码

这不起作用

$newArray = array();
foreach($array as $key => $value) {
   $newArray[(string) $key] = $value;
}
var\u dump()
仍将它们显示为整数数组索引

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

编辑

我假设如果它们是整数,我 无法在不更改的情况下对其重新排序 关键(在这方面很重要 示例)。然而,如果他们是 字符串,我可以重新排列它们的顺序 就像索引不应该那样 解释为有任何特殊的 意思不管怎样,看看我的问题 更新我是如何做到这一点的 不同路线)

实际上,它们不必按数字顺序排列

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
编辑: 这应该行得通

foreach($array as $key => $value) { 
    $newkey = sprintf('%s',$key);
    $newArray["'$newkey'"] = $value; 
} 

使用对象而不是数组
$object=(object)$array

我可以通过在每个键的末尾添加“.0”来实现这一点,例如:

$options = [];
for ($i = 1; $i <= 4; $i++) {
    $options[$i.'.0'] = $i;
}
$options=[];
对于($i=1;$i 1,“2.0”=>2,“3.0”=>3,“4.0”=>4)


它可能不是完全最优的,但它确实允许您对数组进行排序并提取(相当于)原始密钥,而无需截断任何内容。

您不能

包含有效整数的字符串将强制转换为整数类型。例如,键“8”实际上将存储在8下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数

编辑:

事实上你可以

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

包含有效整数的字符串将强制转换为整数类型。例如,键“8”实际上将存储在8下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数

这是PHP文档中的示例

 <?php
    $array = array(
        1    => "a",
        "1"  => "b",
        1.5  => "c",
        true => "d",
    );
    var_dump($array);
?>
因此,即使要创建一个带有编号键的数组,它们也会被转换回整数

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

尝试失败

$arr = array_​change_​key_​case($arr); // worth a try. 
返回一个数组,其中数组中的所有键都是小写或大写的编号索引保持原样

$newArray = array();
foreach($array as $key => $value) {
   $newArray[(string) $key] = $value;
}
我接下来的尝试是通过
array\u combine
将旧值与新的(字符串)键相结合来创建一个新数组

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

range(“A”、“Z”)
适用于字母表,所以我想用数字字符串试试

$keys = range("0", (string) count($arr) ); // integers
这导致了一个满是键的数组,但都是int类型的

下面是两个成功的尝试,它们使用string类型的值创建数组

$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"
编辑:

事实上你可以


所有这些都是免费的

您可以将空字符
“\0”
附加到数组键的末尾。这使得PHP无法将字符串解释为整数。所有的数组函数(如
array\u merge()
)都可以使用它。而且,即使是
var_dump()
也不会在整数字符串之后显示任何额外内容

例如:

$numbers1 = array();
$numbers2 = array();
$numbers = array();

$pool1 = array(111, 222, 333, 444);
$pool2 = array(555, 666, 777, 888);

foreach($pool1 as $p1)
{
    $numbers1[$p1 . "\0"] = $p1;
}
foreach($pool2 as $p2)
{
    $numbers2[$p2 . "\0"] = $p2;
}

$numbers = array_merge($numbers1, $numbers2);

var_dump($numbers);
结果将是:

array(8) {
    ["111"] => string(3) "111"
    ["222"] => string(3) "222"
    ["333"] => string(3) "333"
    ["444"] => string(3) "444"
    ["555"] => string(3) "555"
    ["666"] => string(3) "666"
    ["777"] => string(3) "777"
    ["888"] => string(3) "888"
}
没有
。“\0”
部分生成的数组将是:

array(8) {
    [0] => string(3) "111"
    [1] => string(3) "222"
    [2] => string(3) "333"
    [3] => string(3) "444"
    [4] => string(3) "555"
    [5] => string(3) "666"
    [6] => string(3) "777"
    [7] => string(3) "888"
}
另外,
ksort()
也将忽略空字符,这意味着
$numbers[111]
$numbers[“111\0”]
在排序算法中都具有相同的权重


此方法唯一的缺点是,要访问,例如
$numbers[“444”]
,您实际上必须通过
$numbers[“444\0”]
访问它,而且因为即使
var_dump()
也不会显示结尾处有空字符,因此无法解释为什么会得到“未定义的偏移量”。因此,只有在通过
foreach()
进行迭代的情况下,才可以使用这种方法,否则最终维护您的代码的人都会讨厌您。

只有一位评论者正确地理解了这一点,而公认的答案是错误的
asort()
uasort()
arsort()
是在维护键关联的同时对数组进行排序的内置组件,它们从版本4开始就存在。RTFM,各位

不要乱动密钥来逃避/破坏数据。您无法阻止PHP使用整数键,所以不要尝试。只有当整数表示形式与字符串完全相同时,才会发生这种情况,因此在从数组中读取键和值时,只需将它们转换为整数,即
(string)$key
。您可以使用上述函数执行所需的所有排序操作array(8) { [0] => string(3) "111" [1] => string(3) "222" [2] => string(3) "333" [3] => string(3) "444" [4] => string(3) "555" [5] => string(3) "666" [6] => string(3) "777" [7] => string(3) "888" }
$newArray = array();
foreach($array as $key => $value) {
   $newArray["sample_".$key] = $value;
}