PHP中的数组字符串作为数组键

时间:2010-11-04 19:30:13

标签: php

是否可以使用像"123"这样的数字字符串作为PHP数组中的键,而不将其转换为整数?

$blah = array('123' => 1);
var_dump($blah);

打印

array(1) {
  [123]=>
  int(1)
}

我想要

array(1) {
  ["123"]=>
  int(1)
}

11 个答案:

答案 0 :(得分:77)

没有;不,不是:

来自the manual

  

键可以是整数或字符串。如果一个键是一个整数的标准表示,它将被解释为这样(即“8”将被解释为8,而“08”将被解释为“08”)。

<强>附录

由于下面的评论,我认为指出行为类似而不是相同到JavaScript对象键会很有趣。

foo = { '10' : 'bar' };

foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!

答案 1 :(得分:37)

是的,可以通过数组转换stdClass对象:

$data =  new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );

这给你(最高版本为7.1):

array(1) {
  ["12"]=>
  int(37)
}

(更新:我的原始答案通过使用json_decode()json_encode()显示了一种更复杂的方式,这是不必要的。)

请注意评论:很遗憾,我们无法直接引用该值:$data['12']会产生通知。

<强>更新
从PHP 7.2开始,也可以使用数字字符串作为键来引用值:

var_dump( $data['12'] ); // int 32

答案 2 :(得分:11)

如果需要在php数据结构中使用数字键,则对象将起作用。对象保留顺序,因此您可以迭代。

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';

答案 3 :(得分:8)

我的解决方法是:

$id = 55;
$array = array(
  " $id" => $value
);

space char(prepend)是一个很好的解决方案,因为保持int转换:

foreach( $array as $key => $value ) {
  echo $key;
}

你会看到55为int。

答案 4 :(得分:5)

您可以将键转换为字符串,但由于PHP的松散输入,它最终会转换为整数。亲眼看看:

$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);

从PHP手册:

键可以是整数或字符串。如果一个键是整数的标准表示,它将被解释为这样(即“8”将被解释为8,而“08”将被解释为“08”)。键中的浮点数被截断为整数。索引和关联数组类型在PHP中是相同的类型,它们都可以包含整数和字符串索引。

答案 5 :(得分:1)

我在尝试合并具有字符串和整数键的数组时遇到此问题。重要的是,整数也将作为字符串处理,因为这些是输入字段的名称(如鞋号等,...)

当我使用$data = array_merge($data, $extra);时,PHP会重新排序&#39;按键。在尝试进行排序时,整数键(我尝试使用6 - '6' - "6"甚至(string)"6"作为键)从0重命名为n ......如果你考虑一下,在大多数情况下,这将是理想的行为。

您可以使用$data = $data + $extra;来解决此问题。 非常直接,但我最初没有想到它^^。

答案 6 :(得分:1)

  

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

<强> WRONG

我有一个处理顺序到关联数组转换的转换函数,

$array_assoc = cast($arr,'array_assoc');

$array_sequential = cast($arr,'array_sequential');

$obj = cast($arr,'object');

$json = cast($arr,'json');



function cast($var, $type){

    $orig_type = gettype($var);

    if($orig_type == 'string'){

        if($type == 'object'){
            $temp = json_decode($var);
        } else if($type == 'array'){
            $temp = json_decode($var, true);
        }
        if(isset($temp) && json_last_error() == JSON_ERROR_NONE){
            return $temp;
        }
    }
    if(@settype($var, $type)){
        return $var;
    }
    switch( $orig_type ) {

        case 'array' :

            if($type == 'array_assoc'){

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

            } else if($type == 'array_sequential'){

                return array_values($var);

            } else if($type == 'json'){

                return json_encode($var);
            }
        break;
    }
    return null; // or trigger_error
}

答案 7 :(得分:1)

作为解决方法,您可以使用JSON_FORCE_OBJECT选项将PHP数组编码为json对象。

即,这个例子:

     $a = array('foo','bar','baz');
     echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);

将导致:

     RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}

答案 8 :(得分:0)

我在一个数组上遇到了这个问题,同时将'0'和''作为键。这意味着我无法使用==或===检查我的数组键。

$array=array(''=>'empty', '0'=>'zero', '1'=>'one');
echo "Test 1\n";
foreach ($array as $key=>$value) {
    if ($key == '') { // Error - wrongly finds '0' as well
        echo "$value\n";
    }
}
echo "Test 2\n";
foreach ($array as $key=>$value) {
    if ($key === '0') { // Error - doesn't find '0'
        echo "$value\n";
    }
}

解决方法是在使用之前将数组键强制转换为字符串。

echo "Test 3\n";
foreach ($array as $key=>$value) {
    if ((string)$key == '') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}
echo "Test 4\n";
foreach ($array as $key=>$value) {
    if ((string)$key === '0') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}

答案 9 :(得分:0)

关于@david解决方案,请注意,当您尝试访问关联数组中的字符串值时,这些数字将不起作用。我的猜测是它们在幕后(当访问数组时)被转换为整数并且没有找到任何值。以整数形式访问值也不会起作用。但是你可以使用array_shift()来获取值或迭代数组。

$data = new stdClass;
$data->{"0"} = "Zero";
$data->{"1"} = "One";
$data->{"A"} = "A";
$data->{"B"} = "B";

$data = (array)$data;

var_dump($data);
/*
Note the key "0" is correctly saved as a string:
array(3) {
  ["0"]=>
  string(4) "Zero"
  ["A"]=>
  string(1) "A"
  ["B"]=>
  string(1) "B"
}
*/

//Now let's access the associative array via the values 
//given from var_dump() above:
var_dump($data["0"]); // NULL -> Expected string(1) "0"
var_dump($data[0]); // NULL (as expected)
var_dump($data["1"]); // NULL -> Expected string(1) "1"
var_dump($data[1]); // NULL (as expected)
var_dump($data["A"]); // string(1) "A" (as expected)
var_dump($data["B"]); // string(1) "B" (as expected)

答案 10 :(得分:-1)

我在尝试对数组进行排序时遇到此问题,我需要将排序键设置为hex sha1。当生成的sha1值没有字母时,PHP将该键转换为整数。但我需要根据字符串的相对顺序对数组进行排序。所以我需要找到一种方法来强制键成为字符串而不改变排序顺序。

查看ASCII图表(https://en.wikipedia.org/wiki/ASCII),感叹号的排序与空间大致相同,肯定低于所有数字和字母。

所以我在密钥字符串的末尾添加了感叹号。

for(...) {

    $database[$sha.'!'] = array($sha,$name,$age);
}

ksort($database);
$row = reset($database);
$topsha = $row[0];