1. 程式人生 > >PHP判斷鍵值陣列是否存在,使用empty或isset或array_key_exists

PHP判斷鍵值陣列是否存在,使用empty或isset或array_key_exists

轉自:http://www.cnblogs.com/bourneli/archive/2012/10/12/2721634.html

一個例子

猜猜看,下面的例子會輸出什麼?

1234567891011121314<?php$a = array('a'=>1, 'b'=>0, 'c'=>NULL);echo 'a test by empty: ' , empty($a['a']) ? 'not exist' : 'exist', PHP_EOL;echo 'a test by isset: ' , isset($a['a']) ? 'exist' : 'not exist', PHP_EOL;
echo 'a test by array_key_exists: ' , array_key_exists('a', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;echo 'b test by empty: ' , empty($a['b']) ? 'not exist' : 'exist', PHP_EOL;echo 'b test by isset: ' , isset($a['b']) ? 'exist' : 'not exist', PHP_EOL;echo 'b test by array_key_exists: ' , array_key_exists(
'b', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;echo 'c test by empty: ' , empty($a['c']) ? 'not exist' : 'exist', PHP_EOL;echo 'c test by isset: ' , isset($a['c']) ? 'exist' : 'not exist', PHP_EOL;echo 'c test by array_key_exists: ' , array_key_exists('c', $a) ? 'exist' : 'not exist', PHP_EOL, PHP_EOL;

輸出結果如下:

========================================================

a test by empty: exist

a test by isset: exist

a test by array_key_exists: exist

b test by empty: not exist

b test by isset: exist

b test by array_key_exists: exist

c test by empty: not exist

c test by isset: not exist

c test by array_key_exists: exist

========================================================

注意紅色高亮部分

三種方式的語法區別

  • empty: 引數為0或為NULL時(如上面列子),empty均返回TRUE,詳細情況可以參見empty官方手冊
  • isset: 引數為NULL時,返回FALSE,0與NULL在PHP中是有區別的,isset(0)返回TRUE
  • array_key_exists: 純粹的判斷陣列鍵值對是否存在,無論值是多少

所以,從準確性的角度來看,array_key_exists是最準確的!

三種方式的效能比較

從網上拿到一組資料,參見這裡或參考資料,如下所示:

For a small array:

array_key_exists: float(0.18357992172241)

empty: float(0.072798013687134)

isset: float(0.070242881774902)

For a relative big array:

array_key_exists: float(0.57489585876465)

empty: float(0.0068421363830566)

isset: float(0.0069410800933838)

可以看到在大資料情況下,empty和isset的效能比array_key_exists快了2個數量級,差別還是很大。如果頻繁判斷,還是需要優化。產生這麼大效能差別的原因,個人猜測,可能是isset和empty作為php語法結構不是函式,php直譯器做了優化,而array_key_exists作為函式,沒有相關優化。具體原因,有待通過原始碼考究。

三種方式的使用建議

(鑑於empty與isset效能類似,但是isset準確性較高,這裡就只比較isset與array_key_exists)

  • 如果陣列不可能出現值為NULL的情況,建議使用isset
  • 如果陣列中經常出現值為NULL的情況,建議使用array_key_exists
  • 如果陣列中可能出現值為NULL,但是較少的情況,建議結合isset與array_key_exists使用,如“if (isset($arr[‘key’]) || array_key_exists(‘key’, $arr)){/*do somthing*/}”。此方法兼顧了效能和準確性,但是程式碼變長了。

參考資料


相關推薦

PHP判斷陣列是否存在使用emptyissetarray_key_exists

轉自:http://www.cnblogs.com/bourneli/archive/2012/10/12/2721634.html一個例子 猜猜看,下面的例子會輸出什麼? 1234567891011121314<?php$a = array('a'=>1,

函數內new申請一個不定的內在函數外部怎麽釋放

aso aip lfa weibo 內存 htm atq acl sina 顯肪脅nf4km揮窗賀http://tushu.docin.com/sina_6372928933勻木摯h1yso岡祭殺http://huiyi.docin.com/vsbj275盞伎錐xcjeo瞎

動態放入後臺給的對顯示出來然後動態返回資料(難點:資料格式問題)

一、動態放入後臺的值 將'應發'下的鍵資料${key}放入html中,記得使用轉義字元  ``  ,這個符號實在鍵盤左上角的第二列第一個,來表示裡面寫的是html格式的程式碼。 然後 ${this.data.data['應發'][i][key]}是遍歷每行的key對應的值,

PHP 判斷二維陣列中是否存在某個陣列

function multidimensional_search($parents, $searched) { if (empty($searched) || empty($parents)) { return false; } foreach ($pa

PHP判斷手機是IOS還是Android判斷是否是微信開啟

本文介紹了PHP判斷手機是IOS還是Android的三個小例項,要判斷使用者的手機是安卓的還是ios的,搜了一下相關的資料,最終獲得的結果分享給大家。 例項1:主要是要用到HTTP_USER_AGENT,它表示的意思是用來檢查瀏覽頁面的訪問者在用什麼作業系統(包括版本號)瀏

資料庫參考(Key-value)資料庫列式儲存文件型資料庫圖型資料庫

【TechTarget中國原創】DB-Engines網站專門提供資料庫管理系統流行度的排名資訊,這個排名主要根據5個因素來進行:Google以及Bing搜尋引擎的關鍵字搜尋數量、Google Trends的搜尋數量、Indeed網站中的職位搜尋量、LinkedIn中提到關鍵字的個人資料數以及Stacko

Mysql 如何將結果變為二維陣列

<?php $conn = mysql_connect("localhost","zhouchenglin","zhouchenglin"); mysql_select_db

php陣列根據某一個把相同的合併生成一個新的二維陣列

php陣列根據某一個鍵值,把相同鍵值的合併生成一個新的二維陣列 <?php $infos = array( array( 'a' => 36, 'b' => 'xa', 'c' => '2015-08-28 00:00:00', 'd' => '2

php從一個數組中刪除多個元素獲取陣列對等……

$array1 = array(1,2,3,4,5,6); $array2 = array(2,3); //1、獲取陣列鍵值對 $arr1 = array_keys($array2); var_dump($arr1); Array ( [0] => 0 [1] =&g

php二維陣列按某個排序(突然用到以往知識算是臨時補充筆記吧)

print_r($arr);排序後Array ( [0] => Array ( [name] => 6 [age] => 21 ) [1] => Array (

php 陣列分組 二維陣列將某個相同的合併到一個數組中

php 陣列分組  二維陣列中,將某個鍵值相同的合併到一個數組中,下面是示例程式碼。 //原陣列 $arr    =   array (     0 => array         (             'initial' => 'A',      

php 根據陣列中的指定排序根據陣列中指定分組

一、 根據陣列中的指定鍵值排序1.1 原陣列如下:    $person =  array(                     array('id'=>1,'name'=>'fj','weight'=>100,'height'=>180),   

php獲取多維陣列某個特定(陣列下標)的所有具體總結下其餘的方法

1、專案中經常會用到獲取多維陣列某個特定鍵的所有值,經常的做法是迴圈獲取,今天在網上看到一個不用迴圈獲取的辦法。 /* author: [email protected] description: 根據某一特定鍵(下標)取出一維或多維陣列的所有值;不用迴圈的理由是考慮大陣

MySQL第二天(MySQLMySQL儲引擎)

646day02一、MySQL鍵值(key) ##設置在字段上,約束如何給字段賦值。 普通索引 index唯一索引 unique主鍵 primary key外鍵 foreign key 全文索引 fulltext ++++++++++++++++++++++++++++++++++

php合併陣列並保留的方法

php合併陣列,一般會使用array_merge方法。 array_merge — 合併一個或多個數組   array array_merge ( array $array1 [, array $... ] )    array_merge 將一個或多個數組的單元合併起來,一個

php 對二位陣列按某個排序

<?php $arr = array( array('id'=>2,'price'=>100,'num'=>1), array('id'=>3,'price'=>123,'num'=>1), array('id'=>6,'price'=>11

php陣列常用的處理函式

陣列函式__鍵值操作: 1.array_values($arr): 返回元素值組成的新陣列(索引) 2.array_column($arr,$col, $index): 返回多維陣列中的一列,可指定鍵或索引 3.array_keys($arr,$val,$bool): 返回鍵名組成的新陣列 4.

PHP foreach遍歷陣列之如何判斷當前已經是陣列的最後一個

先給出foreach的兩種語法格式 1,foreach (array_expression as $value) statement 2,foreach (array_expression as $key => $value) statement 第一種格式

php如何實現數組合並但相同的陣列不互相覆蓋?

數組合並array_merge($arr1,$arr2)和陣列相加$arr1+$arr2的區別:數字索引陣列:array_merge:合併生成的陣列的索引統一從0開始,所以不存在覆蓋的情況."+"操作符:不改變數字索引,如果索引已經存在,則跳過該元素.字元索引陣列:array_merge:如果兩個陣列存在相同

PHP通過二維陣列獲取一維

有如下既定陣列: $inviteType = [ '掃碼' => [ 'type' => 0, 'point' => 5, ],