php数组判断键值是否存在示例

 更新时间:2016年11月25日 15:31  点击:1648
因为今天要做一个由数组构成的数据分类了,也就是不用数据库直接使用数组来存储栏目分类了,所以在验证时要以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*/}”。此方法兼顾了性能和准确性,但是代码变长了。

laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。

其实不用 Facade 方式更好用,因为使用 Facade 还要引入命名空间,那不得每个 debug 的地方都引入命名空间吗,这样显得不太好。

laravel-debugbar 提供了全局的函数,位于 /vendor/barryvdh/laravel-debugbar/src/helpers.php,已经在组件的 composer.json 中定义了自动加载,因此可以直接使用帮助函数,如打印 info 级别的日志信息:

debugbar()->info($data);

直接这样调用就好了。

看看函数定义:


if (!function_exists('debugbar')) {
    /**
     * Get the Debugbar instance
     *
     * @return \Barryvdh\Debugbar\LaravelDebugbar
     */
    function debugbar()
    {
        return app('debugbar');
    }
}

打印消息如图所示:

laravel-debugbar 是个很好的调试工具,主持 psr-3 规范对日志消息定义的几种级别,在开发中可以很好的利用这个工具,提高开发、排错的效率。

PHP SDK其实应用很简单一般官方提供了PHP SDK肯定就是案例了,只要我们根据修改参数就可以了下面来看阿里云直播PHP SDK如何使用吧。

1、直播云没有单独的SDK,直播部分的SDK是直接封装在CDN的相关的SDK里面

2、针对SDK,没有demo。

3、针对SDK,没有相关的文档说明。

4、针对SDK的说明,网站上面的说明与源码里面的说明完全不一致。

5、针对SDK没有封装那些常用的访问,需要用户组合调用SDK进行拼装,总之一句,这也太抽象,看看人家七牛的API,哎,不多说啥了

6、提供的SDK路径乱的一踏糊涂,想直接用没门,得各种调整。

7、针对SDK基于PHP更高登记的版本,照顾不到一些低版本用户。

针对上面几点原因,踩了一部分坑,参考其他云直播提供的通用接口进行整理的。

 首先,我们分析一下阿里云提供的PHP SDK。阿里云SDK目录结构如下:

aliyun-php-sdk-core:作为PHP SDK引用核心包,只要使用阿里云的产品的php 的SDK,这个文件夹下的所有东东都是基础。
aliyun-php-sdk-cdn:这个包里面是阿里云 CDN产品的PHP SDK,但是目前直播里面的SDK都在这个里面,可能是因为直播产品和CDN产品比较紧密吧!(PS:在开通直播产品时,CDN产品的开通是前提条件)
 下图为从阿里云的PHP SDK整个大包,里面包含阿里云所有产品的PHP SDK。

接下下来,我们来看看如何配置,这一步很关键,阿里云的官方网站上面内容  与  SDK 的demo  ,有三个版本。(这是痛苦的根源,哈哈)

 1、将整个PHP SDK包放置项目目录当中。

2、配置aliyun-php-sdk-core

在aliyun-php-sdk-core下面有一个config.php文件

 代码如下 复制代码


include_once 'Autoloader/Autoloader.php';
include_once 'Regions/EndpointConfig.php';

//config sdk auto load path.
Autoloader::addAutoloadPath("aliyun-php-sdk-cdn");
// Autoloader::addAutoloadPath("aliyun-php-sdk-batchcompute");
// Autoloader::addAutoloadPath("aliyun-php-sdk-sts");
// Autoloader::addAutoloadPath("aliyun-php-sdk-push");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ram");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ubsms");
// Autoloader::addAutoloadPath("aliyun-php-sdk-ubsms-inner");
// Autoloader::addAutoloadPath("aliyun-php-sdk-green");
// Autoloader::addAutoloadPath("aliyun-php-sdk-dm");
// Autoloader::addAutoloadPath("aliyun-php-sdk-iot");

//config http proxy   
define('ENABLE_HTTP_PROXY', FALSE);
define('HTTP_PROXY_IP', '127.0.0.1');
define('HTTP_PROXY_PORT', '8888');


Autoloader::addAutoloadPath("aliyun-php-sdk-cdn"); 

 这一句作为核心,表示自动加载aliyun-php-sdk-cdn文件夹下所有的PHP文件。aliyun-php-sdk-cdn是直播服务的SDK,若是想使用阿里云的其他功能,则需要引用其他相关的文件夹。

3、调用直播相关PHP SDK

 代码如下 复制代码


//引用config.php文件,路径根据实际情况自行定义
include_once('aliyunopenapi'.DIRECTORY_SEPARATOR.'aliyun-php-sdk-core'.DIRECTORY_SEPARATOR.'Config.php');
//$accessKeyId,$accessSecret为阿里云密钥
$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", $accessKeyId, $accessSecret);
$client = new DefaultAcsClient($iClientProfile);


//初始化直播的具体操作,DescribeLiveRecordConfigRequest是获取直播云下面,所有的创建的app

 代码如下 复制代码

$request = new Cdn\Request\V20141111\DescribeLiveRecordConfigRequest();
$request ->setDomainName('live.ezoon.cn');
$request->setAppName($appname);
$request->setOssEndpoint('oss-cn-hangzhou.aliyuncs.com');
$request->setOssBucket('liveplaybucket');
$request->setOssObjectPrefix('record/'.$appname.'/{StreamName}/{UnixTimestamp}_{Sequence}');
 
//针对阿里云进行请求
 $response = $this->client->getAcsResponse($request);

 print_r("\r\n");
 print_r($response);

 

4、查看数据返回的结果,返回的值是一个对象,里面

 代码如下 复制代码


stdClass Object
(
    [LiveAppRecordList] => stdClass Object
        (
            [LiveAppRecord] => Array
                (
                    [0] => stdClass Object
                        (
                            [CreateTime] => 2016-07-27T09:48:23Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => asfdsadfsadfafds
                            [OssObjectPrefix] => record/asfdsadfsadfafds/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [1] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T06:46:28Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => live1
                            [OssObjectPrefix] => record/live1/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [2] => stdClass Object
                        (
                            [CreateTime] => 2016-07-27T09:37:54Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => live1213123213
                            [OssObjectPrefix] => record/live1213123213/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [3] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T02:55:09Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => liveezoon
                            [OssObjectPrefix] => record/liveezoon/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                    [4] => stdClass Object
                        (
                            [CreateTime] => 2016-07-26T02:55:26Z
                            [DomainName] => live.xxx.cn
                            [OssEndpoint] => oss-cn-hangzhou.aliyuncs.com
                            [AppName] => livetest
                            [OssObjectPrefix] => record/livetest/{StreamName}/{UnixTimestamp}_{Sequence}
                            [OssBucket] => liveplaybucket
                        )

                )

        )

    [RequestId] => 392B879D-2A09-47B3-85CF-627F7BCD3AC1
)

下面我们来看一篇关于使用 PHP 获取 Linux 系统 CPU 负载的文章,希望这篇文章能够给各位同学带来帮助,具体的细节如下所示。

最近使用 PHP 做了一个服务器负载监控的小东西,在服务器上使用 Workerman 开一个 WebSocket 服务,然后在浏览器中连接到服务。服务每隔 10 秒读取一次主机的相关信息,然后发送给客户端,客户端进行图形化显示。

总体的思路就是使用 PHP 调用 shell 命令,然后解析命令的输出内容。在获取 CPU 负载的时候,遇到了一些小问题。直观来说,直接使用 vmstat 命令就可以获取 CPU 负载,但是实际上,vmstat 命令第一行输出的从主机启动以来的平均 CPU 负载,并不是当前的负载。vmstat 命令还有一些参数,比如可以增加一个延迟参数 delay: vmstat 1,表示每秒输出一次数据,直到用户终止命令:


miroot@miserver:~$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 493644 162940 5727744    0    0     2    15    0    0  1  0 99  0
 0  4      0 568392 162952 5656868    0    0   112 15584 8807 4496 29  6 57  7
 3  0      0 567152 162952 5657416    0    0    40   116 10104 5164 28  6 65  2
 2  1      0 566368 162956 5658476    0    0    84 22220 11126 5632 29  7 58  5
 2  2      0 563320 162964 5659200    0    0    56 49240 9765 4792 21  7 53 19
 0  0      0 566464 162976 5659892    0    0    80  1212 9998 5135 26  6 59  9
 2  0      0 565400 162984 5660736    0    0    92   120 9288 4954 29  5 66  1
 ^C
miroot@miserver:~$
 
第一行数据是平均负载,从第二行数据开始,是当前的负载情况。作为监控来讲,肯定更加关注当前的负载情况。
那么,使用 PHP 调用 vmstat,当然不能使用延迟的方式来等待后续行的输出。

查了一些文档,发现在 Linux 上,系统负载的情况在 /proc/stat 这个文件中,这个文件中的内容比较多,所以我们换一个思路,采用 vmstat -s 的方式直接输出内容:


miroot@miserver:~$ vmstat -s
      8165768 K total memory
      4600664 K used memory
      1980464 K active memory
      2249908 K inactive memory
      3565104 K free memory
       232532 K buffer memory
      2972048 K swap cache
      8378364 K total swap
       253352 K used swap
      8125012 K free swap
      1170373 non-nice user cpu ticks
        25184 nice user cpu ticks
       294692 system cpu ticks
   1309152182 idle cpu ticks
      1867039 IO-wait cpu ticks
          566 IRQ cpu ticks
        76405 softirq cpu ticks
            0 stolen cpu ticks
      4601555 pages paged in
     96400000 pages paged out
         1516 pages swapped in
        67468 pages swapped out
    243751059 interrupts
    384963258 CPU context switches
   1455419401 boot time
       184668 forks
miroot@miserver:~$


可以看到,这里面包含很多和 CPU 相关的数据,实际上这个数据的来源就是 /proc/stat 文件。那么我们关心这么几项数据:


      1170373 non-nice user cpu ticks
        25184 nice user cpu ticks
       294692 system cpu ticks
   1309152182 idle cpu ticks


通过 man 5 proc 找到关于 /proc/stat 文件的说明,我们关心的是 CPU 相关数据的说明:


The  amount  of  time,  measured  in  units  of  USER_HZ  (1/100ths  of  a  second  on  most   architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system spent in various states:
user   (1) Time spent in user mode.
nice   (2) Time spent in user mode with low priority (nice).
system (3) Time spent in system mode.
idle   (4)  Time  spent  in the idle task.  This value should be USER_HZ times the second entry in the /proc/uptime pseudo-file.
 
大概的意思就是说,这些数值都是以 USER_HZ 为单位的。不管什么单位,总之他们的单位是一致的,那么我们就可以通过 2 次 vmstat -s 命令的输出来计算每个项上的增量,然后 4 个项上的增量相加就是总体的增量(其实后面还有更多关于 CPU 的数据,我们先忽略掉),然后计算每个项上的增量和总体增量的比,就是在这两次采样之间 CPU 在用户、系统和闲置状态下的负载。

参考代码如下:

 

// 在 Linux 系统上,需要使用 2 次 vmstat -s
// 结果的差值来计算两次采样之间的 CPU 占用比例
$last_cpu_ticks = array(
    0, // non-nice user cpu ticks
    0, // nice user cpu ticks
    0, // system cpu ticks
    0  // idle cpu ticks
    );
function _get_cpu_status_linux()
{
    global $last_cpu_ticks;
 
    $s = shell_exec('vmstat -s | grep cpu');
    if ($s === false) return false;
    $lines = explode("n", $s);
    if (count($lines) < 4) return false;
    $current_data = array();
    for ($i = 0; $i < 4; $i++)
    {
        $current_data[] = (int)(explode(' ', trim($lines[$i]))[0]);
    }
   
    $ret = array('user' => 0, 'sys' => 0, 'idle' => 0);
 
    if ($last_cpu_ticks[0] > 0)
    {  
        $total_delta = 0;
        foreach ($current_data as $i => $v)
            $total_delta += ($v - $last_cpu_ticks[$i]);
 
        $ret['user'] = (int)(($current_data[0] - $last_cpu_ticks[0] + $current_data[1] - $last_cpu_ticks[1]) / $total_delta * 100);
        $ret['sys'] = (int)(($current_data[2] - $last_cpu_ticks[2]) / $total_delta * 100);
        $ret['idle'] = (int)(($current_data[3] - $last_cpu_ticks[3]) / $total_delta * 100);
    }
 
    for ($i = 0; $i < 4; $i++)
        $last_cpu_ticks[$i] = $current_data[$i];
 
    return $ret;
}
 

[!--infotagslink--]

相关文章

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

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • Python 图片转数组,二进制互转操作

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

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

    这篇文章主要介绍了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
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • 一个奇葩的最短的 IE 版本判断JS脚本

    使用 conditional comment 来判断 IE 的版本。嗯,是早早有人提出,但没有认真看代码。昨天刚好在看 CSS3 PIE 的时候看到,觉得是不是不靠谱。今天看到 Paul Irish 也提起,那么,推荐一下吧。这是作者博客上写的:复制代码 代码...2014-05-31
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • c# 判断是否为空然后赋值的4种实现方法

    下面小编就为大家分享一篇c# 判断是否为空然后赋值的4种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • C# 拷贝数组的几种方法(总结)

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

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • MySql存储过程之逻辑判断和条件控制

    具体详情请看下文小编给大家带来的知识点。同编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE1、IF判断IF判断的格式是这样的:IF expression THEN commands [ELSEIF ex...2015-10-21
  • PHP中empty和isset对于参数结构的判断及empty()和isset()的区别

    废话不多说了,直接给大家贴代码了。<&#63;php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = array(); //var $a8; $a9 = new test(); for ($i=1; $i <=9 ; $i++) {...2015-11-24
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • C#读取文件所有行到数组的方法

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

    如何将下面的二维数组转为一维数组。复制代码 代码如下:$msg = array(  array(    'id'=>'45',    'name'=>'jack'  ),  array(    'id'=>'34',    'name'=>'mary'  ),  array(    'id...2014-05-31
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php中数组写入文件方法

    在php中为我们提供了一个函数var_export 他可以直接将php代码入到一个文件中哦。 代码如下 复制代码 var_export($times,true);后面不加tru...2016-11-25