1. 程式人生 > >PHP陣列鍵值Key越界後涉及的資料型別及值範圍淺談

PHP陣列鍵值Key越界後涉及的資料型別及值範圍淺談

做專案時遇到一個問題:

獲取專案介面返回的資料存入PHP陣列作為Key,但是取出來值就不一樣了,嗶---

經過一番大腦回路,發現竟然是PHP陣列Key越界,既然遇到就簡單記錄一下,哎,這一生犯的錯實在太多。  ╯□╰

通過PHP建立關聯陣列的時候,鍵值Key如果是數值型(可通過is_numeric()判斷),則會在int有效範圍內被自動轉換為int型,如果超過int有效範圍就會有問題,這就涉及到陣列鍵值Key作為int型時的有效範圍判斷。

PHP的int型資料取值範圍,與作業系統相關,32位系統上為2的31次方,即-2147483648到2147483647,64位系統上為2的63次方,即-9223372036854775808到9223372036854775807。

那麼一旦PHP陣列鍵值Key存入的數值型資料超過有效範圍,如果該數值型資料是int型就會有問題,是string型數值就不再轉換為int型。

如下鍵值Key為int型越界

<?php  
  $arr=array(
    2147483647=>'test1',
    2147483648=>'test2'
  );
  print_r($arr);
?>
輸出結果為:
Array ( [2147483647] => test1 [-2147483648] => test2 ) 

如下鍵值Key為數值型string越界

<?php
  $arr=array(
  '2147483647'=>'test1',
  '2147483648'=>'test2'
  );
  foreach($arr as $k => $v)
  {
    if(is_int($k))
    {
      echo "int型:".$k."<br />";
    }
    else
    {
      echo "string型:".$k."<br />";
    }
  }
?>

輸出結果為:
int型:2147483647
string型:2147483648



相關推薦

PHP陣列Key越界涉及資料型別範圍

做專案時遇到一個問題: 獲取專案介面返回的資料存入PHP陣列作為Key,但是取出來值就不一樣了,嗶--- 經過一番大腦回路,發現竟然是PHP陣列Key越界,既然遇到就簡單記錄一下,哎,這一生犯的錯實在

PHP關聯陣列在進行JSON化時會出現資料型別變成物件的情況

<?php   $arr =array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);   echo json_encode($arr); &

Redis對的value的資料型別

1、Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。 String型別的資料(作為快取使用),列舉少量用法: 1.插入和讀取一條string型別的資料

VUE脫坑/1-- 如何解決vue 賦資料隨賦資料的變化而變化

錯誤示例 this.leftColumn = {...this.Columns}; this.rightColumn = {...this.Columns}; 正確示例 this.leftColumn = JSON.parse(JSON.strin

PHP-變數(二)(變數值傳遞與引用傳遞,傳遞轉換成引用傳遞)

1. PHP 中的資料型別簡單介紹 在講解 值傳遞 和 引用傳遞 之前,先來了解下 php 中的資料型別 php 中的資料型別大體分為三類: ① 標量資料型別:字串型、整型、

SQL 用於各種資料庫的資料型別(轉載) sqlserver 資料型別範圍 長度

SQL 用於各種資料庫的資料型別 來源 http://www.runoob.com/sql/sql-datatypes.html    面向資料庫程式設計中,資料型別的取值範圍、長度,可能是需要經常檢視的資料。 Microsoft Access、MySQL 和 SQL S

線性表的抽象資料型別求兩陣列的並集

1.operation     InitList(*L):初始化操作,建立一個空的線性表L.      ListEmpty(L):判斷線性表是否為空表,若為空,則返回true,否則返回false。     

8種基本資料型別範圍

整型: byte:-2^7 ~ 2^7-1,即-128 ~ 127。1位元組。Byte。末尾加B short:-2^15 ~ 2^15-1,即-32768 ~ 32767。2位元組。Short。末尾加S 有符號int:-2^31 ~ 2^31-1,即-214748364

MySQL主 資料型別索引的優化

一、安裝 這是同事分享給我的。安裝資料庫也是一門學問,千萬不要被安裝的簡單性而忽略一些細節。針對於 Win os 伺服器而言,MySQL 的安裝版可以選則三種不同的伺服器型別: Developer Machine(開發機器) 為 MySQL 分配最少分系統資源

python基礎之賦、算術、複合賦運算子與常用的資料型別轉換

一**、算術運算子** 運算子為 +、加 -、減 、 乘 /、除 //、取整除 % 、取餘 /、冪 ** 二、 賦值運算子** = 賦值運算子 把等於號= 右邊的結果給左邊的變數 三、複合賦值運算子 += 加法賦值運算子 c += a 等效於 c = c + a -= 減法賦值運算子 c -

C++ (一)資料型別運算

資料型別轉換 double         float long unsigned int               char/short

R-資料型別特殊判斷

R中獲取資料型別資訊的一些有用函式R語言的物件“類”很多,雖然我們不可能一一去詳細學習,但接觸到一類新資料時我們需要了解一些基本資訊才能進行進一步的操作。R提供了一些非常有用的方法(函式)。getClass( )函式我們前面已經見過了,它的引數是表示類的字串。class(

C語言——原碼、反碼、補碼、資料型別範圍

記得剛學C語言的時候,對應資料型別的取值範圍經常會有這樣的疑問:比如8位的二進位制補碼範圍為什麼是-128~127呀?為 什麼會差一個數呀?(以8位為例) 為了解釋這個問題,我們先來了解下幾個概念(

numpy教程:numpy基本資料型別多維陣列元素存取

NumPy介紹Numpy(讀作num-pie)是Python中的一個矩陣計算包,功能類似於MATLAB的矩陣計算。標準安裝的Python中用列表(list)儲存一組值,可以用來當作陣列使用,不過由於列表的元素可以是任何物件,因此列表中所儲存的是物件的指標。這樣為了儲存一個簡單

c# - 資料型別型別,引用型別

c#資料型別分為值型別(Value types),引用型別(Reference types),以及指標型別(Pointer types),而指標型別只在不安全的程式碼中使用,本文不討論指標型別。 值型別的引用的本質是拷貝(copy),是創造一個新的記憶體單元來儲存,新記憶體單元

Redis資料型別常用的操作命令——key操作

可以通過該網站檢視更多redis命令及資訊:http://redisdoc.com/ key: select:用於選擇redis的DB,redis的DB有0-16個數據庫。 keys /key::遍歷該資料庫中的所有的key,key代表具體的key。 EXISTS key:代表是否存在

C語言各種資料型別範圍

轉自:http://blog.csdn.net/mafuli007/article/details/7325510 速查表: char -128 ~ +127 (1 Byte) short -32768 ~ + 32767 (2 Bytes) unsigned sho

Java基本資料型別範圍,為什麼String 不是基本資料型別,char的取範圍為什麼沒有負數

一、在JAVA中一共有八種基本資料型別,他們分別是 byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整數的,只不過他們的取值範圍不一樣 byte的取

MYSQL中支援的資料型別範圍

DATE、TIME 和 TEAR 型別  MySQL用 DATE 和 TEAR 型別儲存簡單的日期值,使用 TIME 型別儲存時間值。這些型別可以描述為字串或不帶分隔符的整數序列。如果描述為字串,DATE 型別的值應該使用連字號作為分隔符分開,而 TIME 型別的值應該使用冒號作為分隔符分開。   需要注意的

Python學習之基本資料型別 bool,邏輯運算子

Truth Value TestingAny object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations b