簡體   English   中英

PHP中作為數組鍵的數字字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM