[英]A numeric string as array key in PHP
是否可以使用像"123"
這樣的數字字符串作為 PHP 數組中的鍵,而不將其轉換為整數?
$blah = array('123' => 1);
var_dump($blah);
印刷
array(1) {
[123]=>
int(1)
}
我想
array(1) {
["123"]=>
int(1)
}
不; 不,這不對:
從手冊:
鍵可以是整數或字符串。 如果鍵是整數的標准表示,它將被解釋為這樣(即“8”將被解釋為 8,而“08”將被解釋為“08”)。
附錄
由於下面的評論,我認為指出行為與 JavaScript 對象鍵相似但不完全相同會很有趣。
foo = { '10' : 'bar' };
foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!
是的,可以通過數組轉換stdClass
對象來實現:
$data = new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );
這給了你(直到 PHP 7.1 版):
array(1) {
["12"]=>
int(37)
}
(更新:我的原始答案通過使用json_decode()
和json_encode()
顯示了一種更復雜的方式,這不是必需的。)
請注意評論:不幸的是,無法直接引用該值: $data['12']
將導致通知。
更新:
從 PHP 7.2 開始,也可以使用數字字符串作為鍵來引用值:
var_dump( $data['12'] ); // int 32
我的解決方法是:
$id = 55;
$array = array(
" $id" => $value
);
空格字符(前置)是一個很好的解決方案,因為保持 int 轉換:
foreach( $array as $key => $value ) {
echo $key;
}
您會看到 55 作為 int。
如果您需要在 php 數據結構中使用數字鍵,則可以使用對象。 對象保持順序,因此您可以迭代。
$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';
您可以將鍵類型轉換為字符串,但由於 PHP 的松散類型,它最終會轉換為整數。 你自己看:
$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);
來自 PHP 手冊:
鍵可以是整數或字符串。 如果鍵是整數的標准表示,它將被解釋為這樣(即“8”將被解釋為 8,而“08”將被解釋為“08”)。 key 中的浮點數被截斷為 integer 。 索引和關聯數組類型在 PHP 中是相同的類型,既可以包含整數索引,也可以包含字符串索引。
我在嘗試合並同時具有字符串和整數鍵的數組時遇到了這個問題。 重要的是整數也將作為字符串處理,因為這些是輸入字段的名稱(如鞋碼等,..)
當我使用$data = array_merge($data, $extra);
PHP 會“重新排序”這些鍵。 在嘗試進行排序時,整數鍵(我嘗試使用6
- '6'
- "6"
even (string)"6"
作為鍵)從 0 重命名為n
...如果您考慮一下,在大多數情況下在這種情況下,這將是理想的行為。
您可以使用$data = $data + $extra;
來解決這個問題。 反而。 很直接,但我一開始並沒有想到它^^。
包含有效整數的字符串將被轉換為整數類型。 例如,鍵“8”實際上將存儲在 8 下。另一方面,“08”不會被強制轉換,因為它不是有效的十進制整數。
錯誤的
我有一個轉換函數,它處理順序到關聯數組轉換,
$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
}
作為解決方法,您可以使用 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"}
我在一個以 '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";
}
}
關於@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)
我在嘗試對需要排序鍵為十六進制 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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.