php数组的索引的学习笔记

 更新时间:2016年11月25日 15:30  点击:1431
下面我们来看一篇关于php数组的索引的学习笔记,希望这篇教程能够帮助到各位朋友,数据索引估计许多的朋友没有看过吧。

存储在数组中的值被称为数组元素,每个数组元素有一个相关的引索(也称为关键字),可以用来访问元素。PHP允许间隔性的使用数字或字符串作为数组的引索。使用字符串作为引索更具有意义和便于使用。

数字索引数组

创建一个数组可以使用如下代码:

$num = array(1, 2, 3, 4, 5, 6);
 
以上代码会创建一个名为 $num 的数组,包含数字从1~6,array() 是一个语言结构,而不是函数。
如果需要按照升序排列数字保存在一个数组中,可以使用 range()函数自动创建这个数组。

$num1 = range(1, 10);
 
这行代码将创建一个1~10的数字数组。range()函数也可以对字符进行操作。
要访问一个数组,可以使用变量名称和关键字或索引的组合来访问其内容。使用 $num[0] ,就可以使用数组 $num 中的数据了。在PHP中,数字索引的默认值是从0开始的。

$num[0] = 1;
 
数字数组使用有序的数字作为引索,可以使用 for 循环来显示数组的内容:


for ($i = 0; $i<6; i++) {
  echo $num[$i];
}
 
非数字索引数组

在PHP中,数组不需要预先初始化或者创建。


$products[0] = rice;
$products[1] = milk;
 
这样就建立了一个数组 $products ,第一行代码是创建一个只有 rice 元素的数组。
还可以使用 => 将每个变量值与关键字关联起来。

$prices = array('rice' => 10, 'milk' => 20);
 
和之前一样,可以使用 $prices[‘rice’] 的方式访问数组,这也是日常使用中常见的方式。

由于非数字索引数组的索引是关键字,所以可以使用 foreach 循环或 list() 和 each() 结构来进行循环访问。

foreach循环


foreach ($prices as $key => $value) {
  echo $key."-".$value."<br />";
}
 
each()结构


while ($element = each($prices)) {
  echo $element['key'];
  echo "-";
  echo $element['value'];
  echo "<br />";
}
 
each() 这个函数将返回数组的当前元素,并将下一个元素作为当前元素。因为在 while 循环中调用 each() 函数,它将按顺序返回数组中每个元素,并且当它到达数组末尾时,循环操作终止。

list()结构


while(list($produce, $price) = each($pirces) {
  echo "$product - $"proce<br />";
}
 

下面我们来看一篇关于CSS 滤镜效果:模糊、灰度、亮度的一个教程,这篇文章是一站长转国外的哦,希望此文章能够帮助到各位朋友。

滤镜原本是 SVG 规范中的一部分。然而,当滤镜的用途变得更广泛时,W3C 也开始给 CSS 增加了一些常用的滤镜效果。CSS 滤镜非常强大又好用,你可以用它来模糊,变亮或饱和度以调整图像。这些滤镜可以单独使用也可以和其它的滤镜组合使用,滤镜的 CSS 语法是这样的:


filter: <filter-function> [<filter-function>]* | none

 
现在开始,我将对这些滤镜做一下简要的介绍。

亮度

该滤镜控制图像的亮度。它可以接受大于或等于零的值作为它的参数。值为 0% 时将变成黑色。值为 100% 时则是原始图像。你可以指定大于 100% 的值以得到更明亮的图像。比如设为 300% 的值将使图像变成 3 倍亮:


img {     filter: brightness(300%); }

对比度

该滤镜控制图像的对比度。同上,它也可以接受大于或等于零的值。该滤镜控制 CSS 里图像的深色和浅色部分之间的差异。因此,值为 0% 时的结果是得到一个灰色图像。对比度值为 100% 则是原始图像,超过此值之后将进一步提高图像的对比度:


img { filter: contrast(0%); }

灰度

从名称上可以明显看出,该滤镜可以使你的图像变灰(黑白化)。该滤镜把所有图像的颜色转换为灰阶值。值为 0% 时对我们的图像没有影响,值为 100% 时会变成他们完全变成黑白,该值不允许为负。


img { filter: grayscale(100%); }


饱和度

该滤镜控制图像的饱和度。值为 0% 时将彻底从图像中删除掉所有颜色,而当值超过 100% 时将使图像饱和度增加。值为 100% 时则是原始图像,该值不允许为负。


img { filter: saturate(0%); }


棕褐色化

这个滤镜会像一些老照片风格那样给图像加上深褐色色调。加入深褐色的量取决于百分比的值。值为 0% 时则是原始图像,并当值为 100% 时,图像将完全褐色。


img { filter: sepia(100%); }

 

色调对调

这个滤镜会把图像的所有颜色的色调对调。在该颜色对调的程度取决于指定的参数的值。当值为 0 度时,图像保持不变。虽然该滤镜没有最大值,但是,超过 360 deg 以上的值的效果会循环。也就是说,90 deg 和 450 deg 这两个值将具有相同的效果。


img { filter: hue-rotate(90deg); }

反色

这个滤镜会把图像的所有颜色反色。反色的量取决于参数的值。值为 0% 时不会对原始图像有任何影响,当值为 100% 时将完全反色。


img { filter: invert(100%); }


模糊

该滤镜适用于高斯模糊图像。它把每个像素的颜色涂抹在一起,并散布到邻近的边缘外围。该滤镜设置的半径参数会确定屏幕上多少的像素会连成一片,越大的值将越模糊。这个滤镜可以接受除了百分比值外的任何长度值。


img { filter: blur(1px); }


不透明度

该滤镜会将使你的图像半透明化。图像将在值为 0% 的时候完全透明,当值为 100% 则保持原样。该滤镜是类似于通常的 opacity 属性。这两者之间的区别只是在性能上略有差异,该滤镜在某些支持硬件加速的浏览器上会有更好的性能。


img { filter: opacity(75%); }


阴影

顾名思义,这个滤镜给图像增加了阴影效果。它基本上是一种对输入图像的 alpha 遮罩的模糊,偏移量是你指定的颜色。此属性需要 x 轴和 y 轴偏移值,以及阴影的颜色值。你也可以设置一个模糊半径值,这会决定阴影是尖锐还是模糊。


img { filter: drop-shadow(5px 5px 10px #666); }


Url()

虽然上述这些滤镜非常有用,但它们都是通用的,你的项目上可能需要更多自定义化效果。如果上述的滤镜没有满足你的需求,你可以创建自己的 SVG 滤镜并通过其 id 使用 url() 来引用这个滤镜。


  <svg style="position: absolute; top: -99999px" xmlns="http://www.w3.org/2000/svg">
<filter id="greenish">
  <feComponentTransfer>
    <feFuncR type="linear" slope="2" intercept="-0.5"/>
    <feFuncG type="linear" slope="2" intercept="-0."/>
    <feFuncB type="linear" slope="2" intercept="-0.25"/>
  </feComponentTransfer>
</filter>
<filter id="bluish">
  <feComponentTransfer>
    <feFuncR type="linear" slope="2" intercept="-0.5"/>
    <feFuncG type="linear" slope="2" intercept="-0.1"/>
    <feFuncB type="linear" slope="2" intercept="0"/>
  </feComponentTransfer>
</filter>
  </svg>

<style type="text/css">
  img {
filter: url('#greenish');
  }
  </style>


组合和动画滤镜

你也把可以多个滤镜组合在一起来创造各种效果。多数情况下,滤镜的顺序并没有多大关系,但是有的滤镜会根据在它们在你的 CSS 顺序会被其他一些滤镜将覆盖。例如,使用一个灰度滤镜后再使用深褐色滤镜最后只会出现一个棕色图像,如果顺序反过来的话会得到的一个灰度化的图像。

滤镜也可变成动画。通过正确的设置动画,你可以创建一些非常有趣的动画效果。以此为例:

img {
animation: haunted 3s infinite;
  }
 
  @keyframes haunted {
0% {
  filter: brightness(20%);
}
48% {
  filter: brightness(20%);
}
50% {
  filter: sepia(1) contrast(2) brightness(200%);
}
....
96% {
  filter: brightness(400%);
}
  }
 
在上面的代码中,具有不同值的多个滤镜会在动画的过程中生效。

 

补充

虽然滤镜会在一个元素的盒模型外描绘,但对该元素的盒子模型的几何结构没有影响。要记住滤镜会影响目标元素的一切,包括:背景,边框和文字修饰。你也可以在视频和内联框架中也使用滤镜。下面的演示说明了这个概念。更多的例子可在 Bennett Feely’s 的网站查看。

iframe

所有这些滤镜都非常伟大且性能很好,除了模糊滤镜之外,如果你的浏览器不支持硬件加速的话可能会有些慢。url() 滤镜的性能会根据你使用哪些 SVG 滤镜而决定。

filter 属性被所有主流浏览器支持。Chrome 和 Opera 需要这个属性的前缀版本一起使用。滤镜不支持 IE,不过 Edge 可以部分支持,也就是除了 url() 之外都支持。

结语

本贴给开发者探索了许多 CSS 滤镜功能。它们有很好的浏览器支持性,易于使用且比 canvas 的方案有更好的性能。此外,正如我在上面提到的,你也可以在视频以及与其他元素中使用。

如果你还有更绝妙的利用滤镜的方法,请给我留个言,或者提出你的疑问。

PHP错误日志我们前面有介绍过一篇关于log_errors 的用法了,下面我们再来看一篇关于PHP错误日志的使用及汇总,具体的如下文介绍。


对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?

我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者 管理人员查看系统是否存在问题。

如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中 或发送给系统syslog,分别介绍如下:

1、使用指定的文件记录错误报告日志

如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写权限。

假设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写的权限。然后在PHP的配置文件中, 将error_log指令的值设置为这个错误日志文件的绝对路径。

此时需要将php.ini中的配置指令做如下修改:

1. error_reporting  =  E_ALL               ;将会向PHP报告发生的每个错误  

2. display_errors = Off                    ;不显示满足上条 指令所定义规则的所有错误报告  

3. log_errors = On                         ;决定日志语句记录的位置  

4. log_errors_max_len = 1024               ;设置每个日志项的最大长度  

5. error_log = /www/phpernote/error.log    ;指定产生的 错误报告写入的日志文件位置 

PHP的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/www/phpernote/error.log文件中。

此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。该函数的原型如下所示:

1. bool error_log ( string message [, int message_type  [, string destination [, string extra_headers]]] ) 

此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。该函数执行成功则返回TRUE,失败则返回FALSE。

第一个参数 message 是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送消息。

第二个参数 message_type为整数值:0表示送到操作系统的日志中;1则使用PHP的Mail()函数,发送信息到某E-mail处。

第四个参数extra_headers亦会用到;2则将错误信息送到TCP服务器中,此时第三个参数destination表示目的地IP及Port;3则将信息存到文件destination中。

如果以登入Oracle数据库出现问题的处理为例,该函数的使用如下所示:

if(!Ora_Logon($username, $password)){    
    error_log("Oracle数据库不可用!", 0);        //将错误消息写入到操作系统日志中  
}
if(!($foo=allocate_new_foo()){  
    error_log("出现大麻烦了!", 1, ". 111cn.net");   //发送到管理员邮箱中  
}
error_log("搞砸了!",2,"localhost:5000");     //发送到本机对应5000端口的服务器中
error_log("搞砸了!",3,"/usr/local/errors.log");  //发送到指定的文件中


2、 错误信息记录到操作系统的日志里

错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别。在Linux上错误语句将送往syslog,而在Windows上错误将发送到事件日志里。如果你不熟悉syslog,起码要知道它是基于UNIX的日志工具,它提供了一个API来记录与系统和应用程序执行有关的消息。

Windows事件日志实际上与UNIX的syslog相同,这些日志通常可以通过事件查看器来查看。如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog。

具体需要在php.ini中修改的配置指令如下所示:

1. error_reporting  =  E_ALL                   ;将会向PHP报告发生的每个错误  

2. display_errors = Off                        ;不显示 满足上条指令所定义规则的所有错误报告  

3. log_errors = On                             ;决定日志语句记录的位置  

4. log_errors_max_len = 1024                   ;设置每个日志项的最大长度  

5. error_log = syslog                          ;指定产生的错误报告写入操作系统的日志里 

除了一般的错误输出之外,PHP还允许向系统syslog中发送定制的消息。虽然通过前面介绍的error_log()函数,也可以向syslog中发送定制的消息,但在PHP中为这个特性提供了需要一起使用的4个专用函数。

分别介绍如下:

define_syslog_variables()

在使用openlog()、syslog及closelog()三个函数之前必须先调用该函数。因为在调用该函数时,它会根据现在的系统环境为下面三个函数初使用化一些必需的常量。

openlog()

打开一个和当前系统中日志器的连接,为向系统插入日志消息做好准备。并将提供的第一个字符串参数插入到每个日志消息中,该函数还需要指定两个将在日志上下文使用的参数,可以参考官方文档使用。

 syslog()

该函数向系统日志中发送一个定制消息。需要两个必选参数,第一个参数通过指定一个常量定制消息的优先级。例如LOG_WARNING表示一般的警告,LOG_EMERG表示严重地可以预示着系统崩溃的问题,一些其他的表示严重程度的常量可以参考官方文档使用。第二个参数则是向系统日志中发送的定制 消息,需要提供一个消息字符串,也可以是PHP引擎在运行时提供的错误字符串。

closelog()

该函数在向系统日志中发送完成定制消息以后调用,关闭由openlog()函数打开的日志连接。

如果在配置文件中,已经开启向syslog发送定制消息的指令,就可以使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的syslog解析工具,查看和分析由PHP程序发送的定制消息,如下所示:


define_syslog_variables(); 

openlog("PHP5", LOG_PID , LOG_USER); 

syslog(LOG_WARNING, "警告报告向syslog中发送的演示, 警告时间:".date("Y/m/d H:i:s"));

closelog();

以Windows系统为例,通过右击"我的电脑"选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了。上面这段代码将在系统的syslog文件中,生成类似下面的一条信息,是事件的一部分:

1. PHP5[3084], 警告报告向syslog中发送的演示, 警告时间:2009/03/26 04:09:11. 

使用指定的文件还是使用syslog记录错误日志,取决于你所在的Web服务器环境。如果你可以控制Web服务器,使用syslog是最理想的,因为你能利用syslog的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。

error_log开启需要在apache中打开了,但是我们也可以在于php中来记录了在php中有一个error_log函数只要apache中的error_log = on我们就可以使用,具体的来看看。

做开发的经常碰到这种情况,在线下测试的挺好的程序,上传到线上(生产环境)就会出现奇奇怪怪的错误,比如出现个空白页面,也不知道是哪里出问题了,而线上又不允许调试,那该如何去解决这个问题呢?除了在仔细一遍遍的检查代码外,还可以通过开启php的error_log来排查错误。

大家应该都知道当php.ini中的display_errors设置为on的时候,运行程序的时候经常会看到满屏的notice warning啊什么的。

开启error_log的情况下也会记录这些notice warning信息,但是会将这些信息记录到error_log设置的文件里面去,而不是直接显示到屏幕上。

下面说下开启php的error_log的方法。

编辑php.ini,将log_errors设置为on

log_errors = On

找到error_log参数,记住其所定义的文件位置或者自己定义文件位置,注意这个文件需要授予php标识用户的修改权限,否则日志文件无法生成。

error_log = /home/www/phpernote/error.log

然后重启apache或者nginx服务器即可。


error_log() 将错误信息写入一个文件

error_log() 是发送错误信息到某个地方的一个函数,在程序编程中比较常见,尤其是在程序调试阶段。

本文将用实例讲解一下error_log()这个函数的用法,以及一些需要注意的问题。

实例

<?php
$str = '这是条错误信息。';
error_log($str, 3, 'errors.log');
?>

 
上述是最常用的error_log()例子,它的作用是把一条信息写入errors.log这个文件里,这个文件如果不存在则自动创建。在这个例子中,我们看到有一个参数“3”,注意这个数字“3”不能更改也不能去掉。

error_log()可能出现的问题

◆问题一:

Warning: error_log() [function.error-log]: failed to open stream: Permission denied in ...on line ...

上述错误的出现,是因为文件没有写权限,开启该目录的文件写权限即可。

◆问题二:

log文件为什么不能换行?

使用error_log()写入log文件,会发现文字是没有换行的,这给阅读带来很大的困难,需要改进下。经研究,使用如下代码,可以写入换行的信息。

<?php
$str = "这是条错误信息。\r\n";
error_log($str, 3, 'errors.log');
?>

 
注意$str,用的是双引号(php单引号和双引号的区别),还在字符串结尾加上了\r\n。这跟第一个实例那个写法是不同的。

知识扩充

下面补充error_log()函数的使用知识

格式
bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
把错误信息发送到 web 服务器的错误日志,或者到一个文件里。

message
应该被记录的错误信息。

message_type
设置错误应该发送到何处。使用 操作系统的日志机制或者一个文件,取决于 error_log 指令设置了什么。

可能的信息类型有以下几个:

0 message 发送到 PHP 的系统日志。 这是个默认的选项。
iis服务器运行调试php程序错误信息生成log文件在哪里
1 message 发送到参数 destination 设置的邮件地址。 第四个参数 extra_headers 只有在这个类型里才会被用到。
2 不再是一个选项。
3 message 被发送到位置为 destination 的文件里。 字符 message 不会默认被当做新的一行,而是追加到行末。
4 message 直接发送到 SAPI 的日志处理程序中。
destination
目标。它的含义描述于以上,由 message_type 参数所决定。

extra_headers
额外的头。当 message_type 设置为 1 的时候使用。 该信息类型使用了 mail() 的同一个内置函数。

返回值
成功时返回 TRUE, 或者在失败时返回 FALSE。

例子

本例发送一封带有自定义错误的电子邮件:

<?php
$test=2;

if ($test>1)
{
error_log("A custom error has been triggered",
1,"someone@example.com","From: webmaster@example.com");
}
?>输出:

A custom error has been triggered PS: 在调试php代码的时候,除了使用error_log()函数,还可以使用 throw new Exception()抛出异常信息。

display_errors与log_errors的区别

display_errors
错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项。
display_errors = On
开启状态下,若出现错误,则报错,出现错误提示
dispaly_errors = Off
关闭状态下,若出现错误,则提示:服务器错误。但是不会出现错误提示

log_errors
在正式环境下用这个就行了,把错误信息记录在日志里。正好可以关闭错误回显。

对于PHP开发人员来说,一旦某个产品投入使用,那么第一件事就是应该将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。

某个产品投入使用后,难免会有错误信息,那么如何记录这些对开发人员非常有用的信息呢?
将PHP的log_errors开启即可,默认是记录到WEB服务器的日志文件里,比如Apache的error.log文件。
当然也可以记录错误日志到指定的文件中。

# vim /etc/php.inidisplay_errors = Off
log_errors = On
error_log = /var/log/php-error.log

另外也可以设定error_log = syslog,使这些错误信息记录到操作系统的日志里。
display_errors = Off //display中文意思是显示所以display_error=off的意思就是不显示错误了!
error_reporting 设定错误讯息回报的等级
2047我记得应该是E_ALL。
php.ini 文件中有许多配置设置。您应当已经设置好自己的 php.ini 文件并把它放在合适的目录中,就像在 Linux 上安装 PHP 和 Apache 2 的文档说明中所示的那样(请参阅 参考资料)。在调试 PHP 应用程序时,应当知道两个配置变量。下面是这两个变量及其默认值:
display_errors = Off //关闭所有错误信息,为ON时为显示所有错误信息。
error_reporting = E_ALL
E_ALL能从不良编码实践到无害提示到出错的所有信息。E_ALL 对于开发过程来说有点太细,因为它在屏幕上为一些小事(例如变量未初始化)也显示提示,会搞糟浏览器的输出
所以不建议使用2047,最好把默认值改为:error_reporting = E_ALL & ~E_NOTICE

PHP.ini中display_errors = Off失效的解决

问题:
PHP设置文件php.ini中明明已经设置display_errors = Off,但是在运行过程中,网页上还是会出现错误信息。
解决:
经查log_errors= On,据官方的说法,当这个log_errors设置为On,那么必须指定error_log文件,如果没指定或者指定的文件没有权限写入,那么照样会输出到正常的输出渠道,那么也就使得display_errors 这个指定的Off失效,错误信息还是打印了出来。于是将log_errors = Off,问题就解决了。

经常见到error_reporting(7)直意为:设定错误讯息回报的等级。

value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
然而7=1+2+4

就是出错时显示1 E_ERROR 2 E_WARNING 4 E_PARSE

<?php
//禁用错误报告
error_reporting(0);
//报告运行时错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//报告所有错误
error_reporting(E_ALL);
?>

因为今天要做一个由数组构成的数据分类了,也就是不用数据库直接使用数组来存储栏目分类了,所以在验证时要以key作为ID,但是传值时我们要验证Key是否存了,所以用到了判断键值是否存功能,下面就来看一篇小编整理的php数组判断键值是否存在示例,具体如下。

PHP 检测数组是否存在某个键值 判断数组索引是否存在 array_key_exists();

bool array_key_exists ( mixed key, array search )

 代码如下 复制代码

<?php
/*
 
array_key_exists() 在给定的 key 存在于数组中时返回 TRUE。key 可以是任何能作为数组索引的值。
 
*/
 
$search_array = array("first" => 1, "second" => 4);
if (array_key_exists("first", $search_array)) {
   echo "The 'first' element is in the array";
}
?>

网上说还有empty,isset也可以来验证key值是否存在

empty: 参数为0或为NULL时(如上面列子),empty均返回TRUE,详细情况可以参见empty官方手册
isset: 参数为NULL时,返回FALSE,0与NULL在PHP中是有区别的,isset(0)返回TRUE

 代码如下 复制代码

<?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*/}”。此方法兼顾了性能和准确性,但是代码变长了。

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • MySQL中的联合索引学习教程

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进...2015-11-24
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP 二维数组根据某个字段排序的具体实现

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#读取文件所有行到数组的方法

    这篇文章主要介绍了C#读取文件所有行到数组的方法,涉及C#针对文件及数组的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • 将二维数组转为一维数组的2种方法

    如何将下面的二维数组转为一维数组。复制代码 代码如下:$msg = array(  array(    'id'=>'45',    'name'=>'jack'  ),  array(    'id'=>'34',    'name'=>'mary'  ),  array(    'id...2014-05-31
  • php中数组写入文件方法

    在php中为我们提供了一个函数var_export 他可以直接将php代码入到一个文件中哦。 代码如下 复制代码 var_export($times,true);后面不加tru...2016-11-25
  • PHP 如何获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享。 具体是这样的,如下一个二维数组,是从库中读取出来的。 代码清单: 复制代码 代码如下: $user = array( 0 => array( 'id' => 1, 'name' => '张三', 'ema...2014-06-07
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • js有序数组的连接问题

    1.前言 昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。2.简单但效率不高的算法 我首先想到的是使用...2013-10-04
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • python 实现将Numpy数组保存为图像

    今天小编就为大家分享一篇python 实现将Numpy数组保存为图像,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)

    在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,但是该选择哪种类型进行存储数据呢?很迷茫,今天小编抽空给大家整理下这方面的内容,需要的朋友参考下吧...2020-06-25