php数组搜索(多维数组搜索)

 更新时间:2016年11月25日 17:09  点击:1873
在php中要实现数组搜索方法有很多种,我知道最简单的就是in_array与遍历数组后再一个个对比,其它还有更多更好方法,下面我来介绍介绍。

 

一维数组搜索很简单in_array()

如果 value 参数是字符串,且 type 参数设置为 true,则搜索区分大小写

 代码如下 复制代码

<?php
$people = array("Peter", "Joe", "Glenn", "Cleveland");

if (in_array("Glenn",$people))
  {
  echo "Match found";
  }
else
  {
  echo "Match not found";
  }
?>

输出:

Match found


 array_key_exists()函数

 如果在一个数组中找到一个指定的键,函数array_key_exists()返回true,否则返回false。其形式如下:

boolean array_key_exists(mixed key,array array); 

下面的例子将在数组键中搜索apple,如果找到,将输出这个水果的颜色:

 代码如下 复制代码

 
$fruit["apple"] = "red";
$fruit["banana"] = "yellow";
$fruit["pear"] = "green";
if(array_key_exists("apple", $fruit)){
 printf("apple's color is %s",$fruit["apple"]);
}

//apple's color is red

 

array_search()函数

 array_search()函数在一个数组中搜索一个指定的值,如果找到则返回相应的键,否则返回false。其形式如下:

mixed array_search(mixed needle,array haystack[,boolean strict])

下面的例子在$fruits中搜索一个特定的日期(December 7),如果找到,则返回相应州的有关信息:

 代码如下 复制代码

 
$fruits["apple"] = "red";
$fruits["banana"] = "yellow";
$fruits["watermelon"]="green";
$founded = array_search("green", $fruits);
if($founded)
 printf("%s was founded on %s.",$founded, $fruits[$founded]);

//watermelon was founded on green.

 

array_keys()函数

 array_keys()函数返回一个数组,其中包含所搜索数组中找到的所有键。其形式如下:

 array array_keys(array array[,mixed search_value]) 


如果包含可选参数search_value,则只会返回与该值匹配的键。下面的例子将输出$fruit数组中找到的所有数组:

 代码如下 复制代码


$fruits["apple"] = "red";
$fruits["banana"] = "yellow";
$fruits["watermelon"]="green";
$keys = array_keys($fruits);
print_r($keys);

//Array ( [0] => apple [1] => banana [2] => watermelon )

 array_values()函数

 array_values()函数返回一个数组中的所有值,并自动为返回的数组提供数值索引。其形式如下:

array array_values(array array) 

下面的例子将获取$fruits中找到的各元素的值:

 代码如下 复制代码

 
$fruits["apple"] = "red";
$fruits["banana"] = "yellow";
$fruits["watermelon"]="green";
$values = array_values($fruits);
print_r($values);

//Array ( [0] => red [1] => yellow [2] => green )

上面讲到的都只是一维数组搜索了,如果要实现二维数据或多维数据我们可参考下面实例

1 php搜索多维数组的键值

如下面例子:

 代码如下 复制代码

$foo[1]['a']['xx'] = 'bar 1';
$foo[1]['b']['xx'] = 'bar 2';
$foo[2]['a']['bb'] = 'bar 3';
$foo[2]['a']['yy'] = 'bar 4';
$foo[3]['c']['dd'] = 'bar 3';
$foo[3]['f']['gg'] = 'bar 3';
$foo['info'][1] = 'bar 5';

如果要查找 bar 3 怎么进行查找呢。有三个结果,而这三个结果都要,看下面的函数:
-------------------------------------------------------------------------------------------------------------------------------
function array_search_re($needle, $haystack, $a=0, $nodes_temp=array()){
global $nodes_found;
$a++;
foreach ($haystack as $key1=>$value1) {
    $nodes_temp[$a] = $key1;
    if (is_array($value1)){  
      array_search_re($needle, $value1, $a, $nodes_temp);
    }
    else if ($value1 === $needle){
      $nodes_found[] = $nodes_temp;
    }
}
return $nodes_found;
}
---------------------------------------------------------------------------------------------------------------------------------
这个函数就可以把上面要查找到的内容全部返回出键名来
$result = array_search_re('bar 3', $foo);

print_r($result);

输出结果为如下:
Array ( [0] => Array ( [1] => 2 [2] => a [3] => bb )
          [1] => Array ( [1] => 3 [2] => c [3] => dd )
          [2] => Array ( [1] => 3 [2] => f [3] => gg )
        )

php搜索多维数组的键名

 代码如下 复制代码

function array_search_key($needle, $haystack){
global $nodes_found;

foreach ($haystack as $key1=>$value1) {
 
 if ($key1=== $needle){
 
  $nodes_found[] = $value1;
      
   }
    if (is_array($value1)){  
      array_search_key($needle, $value1);
    }
  
  
}

return $nodes_found;
}
$result = array_search_key('a', $foo);

print_r($result);

输出结果为如下:
 

Array
(
    [0] => Array
        (
            [xx] => bar 1
        )

    [1] => Array
        (
            [bb] => bar 3
        )

    [2] => Array
        (
            [yy] => bar 4
        )

)

在php中file_get_contents与curl()函数都可以用来抓取对方网站的数据并保存到本地服务器中,但是总得来讲file_get_contents()效率稍低些,常用失败的情况、curl()效率挺高的,支持多线程,不过需要开启下curl扩展,也就是说要使用curl函数就必须要打开curl扩展了,而file_get_contents函数系统是默认的哦。

下面是curl扩展开启的步骤:

1、将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay32.dll复制到system32下;
2、将php.ini(c:WINDOWS目录下)中的;extension=php_curl.dll中的分号去掉;

3、重启apache或者IIS。

我们先来看看两个函数的简单实例

curl()函数

 代码如下 复制代码

$ch = curl_init("http://www.111cn.net/");
curl_exec($ch);
curl_close($ch);

//$ch = curl_init("要采集的网址");  curl_init()函数的作用初始化一个curl会话

//curl_exec($ch);执行$ch

//curl_close($ch); 关闭$ch

file_get_contents函数

例子

 代码如下 复制代码
<?php
echo file_get_contents("http://www.111cn.net");
?>

输出:

 代码如下 复制代码

This is a test file with test text.

总结

fopen / file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。
所以CURL的性能比fopen / file_get_contents 好很多。


file_get_contents与curl效率及稳定性问题

 代码如下 复制代码

$config['context'] = stream_context_create(array('http' => array('method' => "GET",'timeout' => 5))); 

 
'timeout' => 5//这个超时时间不稳定,经常不好使。这时候,看一下服务器的连接池,会发现一堆类似下面的错误,让你头疼万分:

 代码如下 复制代码
file_get_contents(http://***): failed to open stream… 

 

不得已,安装了curl库,写了一个函数替换:

 代码如下 复制代码

function curl_get_contents($url)  
{  
   $ch = curl_init();  
   curl_setopt($ch, CURLOPT_URL, $url);            //设置访问的url地址  
   //curl_setopt($ch,CURLOPT_HEADER,1);            //是否显示头部信息  
   curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时  
   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);   //用户访问代理 User-Agent  
   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);        //设置 referer  
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果  
    $r = curl_exec($ch);  
    curl_close($ch);  
    return $r;  

如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:

 代码如下 复制代码

1.2.31319094  
2.2.30374217  
3.2.21512604  
4.3.30553889  
5.2.30124092 

curl使用的时间:

1.0.68719101  
2.0.64675593  
3.0.64326  
4.0.81983113  
5.0.63956594 


那么如何根据服务器情况来使用file_get_contents还是curl()呢,下面我们可以利用function_exists函数来判断php是否支持一个函数可以轻松写出下面函数

 代码如下 复制代码

< ?php
 function vita_get_url_content($url) {
 if(function_exists('file_get_contents')) {
 $file_contents = file_get_contents($url);
 } else {
 $ch = curl_init();
 $timeout = 5; 
 curl_setopt ($ch, CURLOPT_URL, $url);
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
 curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 $file_contents = curl_exec($ch);
 curl_close($ch);
 }
 return $file_contents;
 }
 ?>

一篇php中匹配邮箱地址正则表达式实例,邮箱地址替换正则我常用的正则匹配表达式:/^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\\.][a-z]{2,3}([\\.][a-z]{2})?$/i,下面来详细分析有需要的朋友可参考。

php例

下面以PHP为例进行说明:

 代码如下 复制代码
< ?php
if (ereg(“/^[a-z]([a-z0-9]*[-_.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[.][a-z]{2,3}([.][a-z]{2})?$/i; ”,$email))
{
   echo “Your email address is correct!”;
}
else
{
   echo “Please try again!”;
}
?>

说明:
①/内容/i 构成一个不区分大小写的正则表达式;^ 匹配开始;$ 匹配结束。

②[a-z] E-Mail前缀必需是一个英文字母开头

③([a-z0-9]*[-_]?[a-z0-9]+)* 和_a_2、aaa11、_1_a_2匹配,和a1_、aaff_33a_、a__aa不匹配,如果是空字符,也是匹配的,*表示0个或者多个。

④*表示0个或多个前面的字符.

⑤[a-z0-9]* 匹配0个或多个英文字母或者数字;[-_]? 匹配0个或1“-”,因为“-”不能连续出现。

⑥[a-z0-9]+ 匹配1个或多个英文字母或者数字,因为“-”不能做为结尾

⑦@ 必需有个有@

⑧([a-z0-9]*[-_]?[a-z0-9]+)+ 见上面([a-z0-9]*[-_]?[a-z0-9]+)*解释,但是不能为空,+表示一个或者为多个。

⑨[.] 将特殊字符(.)当成普通字符;[a-z]{2,3} 匹配2个至3个英文字母,一般为com或者net等。
⑩([.][a-z]{2})? 匹配0个或者1个[.][a-z]{2}(比如.cn等) 我不知道一般.com.cn最后部份是不是都是两位的,如果不是请修改{2}为{起始字数,结束字数}


js例

 代码如下 复制代码

<script>
function Email(ee){
var emailreg = "^\w+@\w+\.\w+(\.\w+)*$";

var rege = new RegExp(emailreg, 'g');
alert(rege.test(ee));
}
var ee1 = "12xwz@123e^rsrf6.csdfdfom.df";
var ee2 = "12xwz@123ersrf6.csdfdfom.df";
Email(ee1);
Email(ee2);
</script>

为了让你更好的掌握正则,请学习字符串转义形式
这里,你用字符串表示正则,转义符要用\表示,如果要匹配则要用\
^\w+@\w+\.\w+(\.\w+)*$
开始是w word有一个或多个
@后
是一个word
.后是一个word有一个或多个
(\.\w+)*可以没有或多个

要遍历一个文件夹里面的所有目录,列出里面所有的文件,PHP本身自带的有一个readdir的函数,不过只能读取当前的目录,根据这个函数,我写了另外一个函数,用来实现我的需求。
 代码如下 复制代码

<?php
class listdir{
var $depth;
var $dirname;
var $list;
var $tostring;

function listdir($dir){
$this->dirname=$dir;
$this->depth=0;
$this->tostring=”";
}

//把结果保存进多维数组
function getlist($dir=”"){
if($dir==”")$dir=$this->dirname;
$d=@dir($dir);
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->getlist($path);
}else{
$this->list[$this->depth][]=$item;
}
}
}
$this->list[$this->depth]['directory']=$dir;
$this->depth-=1;
$d->close();
return $this->list;
}

//字符窜化结果

function tostring($dir=”"){
if($dir==”")$dir=$this->dirname;
$d=@dir($dir);
$this->tostring.=”<UL>n”;
$this->tostring.=”Directory:”.$dir.”n”;
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->tostring($path);
}else{
$this->tostring.=”<LI>”.$item.”</LI>n”;
}
}
}
$this->depth-=1;
$d->close();
$this->tostring.=”</UL>n”;
return $this->tostring;
}
}
$wapdir=”jquery”;
$d=new listdir($wapdir);
echo $d->tostring();
?>

要删除一个空的目录很简单~一个
 
rmdir() 函数就可以搞定,但是要删除一个非空目录,将不能进行快速的删除,必须先将目录中文件删除,但是目录里可能还会有子目录所以要进行递归删除~下面是我的例子~
 

 代码如下 复制代码
<?php
function deletedir($dir){
      if(!handle=@opendir($dir)){     //检测要打开目录是否存在
               die("没有该目录");
      }
     while(false !==($file=readdir($handle))){
               if($file!=="."&&$file!==".."){       //排除当前目录与父级目录
                            $file=$dir .DIRECTORY_SEPARATOR. $file;
                            if(is_dir($file)){
                                  deletedir($file);
                            }else{
                                  if(@unlink($file)){
                                         echo "文件<b>$file</b>删除成功。<br>";
                                  }else{
                                          echo  "文件<b>$file</b>删除失败!<br>";
                                 }
                }
     }
    if(@rmdir($dir)){
           echo "目录<b>$dir</b>删除成功了。<br>n";
    }else{
           echo "目录<b>$dir</b>删除失败!<br>n";
  }
}
 
//测试程序
$dir="/var/www/test";
deletedir($dir);
?>
在php中我们会经常碰到一些错误要去处理,下面我来总结php中的异常处理、错误报告、日志一些内容总结与介绍。

错误处理:

1.语法错误

2.运行时错误

3.逻辑错误

错误报告:

错误:E_ERROT 程序会中断,发生错误

警告:E_WARNING 程序不会中断,但可能部分功能没有实现

注意:E_NOTICE 不会影响程序,完全可以屏蔽

开发时输出所有错误报告,运行时禁用所有错误报告

将错误写入到日志中:

1.开启日志(php.ini中error_log = On),且关闭错误报告,错误(如果发生,但没有允许直接输出)日志将会被记录

2.如不指定日志路径,将默认写入web服务器日志中

设置错误报告:

error_reporting(E_ALL) //输出所有报告

修改php.ini配置文件:

 代码如下 复制代码

ini_set(“display_errors”,off) //修改为不显示错误报告

ini_get(“upload_max_filesize”) //读取配置文件中上传文件大小限制

异常处理:

意外,是在程序运行中发生的意料之外的事,使用异常改变脚本正常流程

PHP 5 提供了一种新的面向对象的错误处理方法。

异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:

•当前代码状态被保存
•代码执行被切换到预定义的异常处理器函数
•根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:

•异常的基本使用
•创建自定义的异常处理器
•多个异常
•重新抛出异常
•设置顶层异常处理器

语法:

 代码如下 复制代码

try{

可能出错的代码

throw new Exception(“异常信息”)

}catch(Exception $e[异常对象]){

后面的正常代码

}


 代码如下 复制代码

function   runtimeErrorHandler($level,$string)
{
//自定义错误处理时,手动抛出一个异常实例
//为了把错误级别代码也显示出来,这里拼接了错误代码和错误信息作为新的错误信息来传递。
throw   new   Exception($level.'|'.$string);
}
//设置自定义错误处理函数
set_error_handler( "runtimeErrorHandler");

try
{
$a=2/0; 
//这里制造一个以前无法截获的除0错误
}
catch(Exception $e)
{
echo '错误信息:', $e->getMessage();
//显示错误,这里就可以看到错误级别和错误信息了“2|Division by zero”
}

1.如果try中代码没有异常,则正常执行。

2.如果try中代码有异常,则抛出一个异常对象,在catch()中捕捉$e就指向异常对象。再继续向下执行

3.$e->getMessage()获取异常信息

自定义异常类:

作用:写一些方法解决特定异常(内置的类没有处理方法)

1.自定义异常类,必须是Exception(内置类)的子类

2.Exception类中只有构造方法和toString()可以重写

3.定义需要的方法

异常的规则

•需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
•每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
•使用多个 catch 代码块可以捕获不同种类的异常。
•可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。

[!--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
  • vue+高德地图实现地图搜索及点击定位操作

    这篇文章主要介绍了vue+高德地图实现地图搜索及点击定位操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-09
  • 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
  • js有序数组的连接问题

    1.前言 昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。2.简单但效率不高的算法 我首先想到的是使用...2013-10-04
  • python 实现将Numpy数组保存为图像

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

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

    这篇文章主要介绍了C#中数组初始化与数组元素复制的方法,涉及C#中数组的创建、初始化及使用Array.Copy方法复制数组元素的技巧,需要的朋友可以参考下...2020-06-25
  • C#中List和数组之间转换的方法

    这篇文章主要介绍了C#中List和数组之间转换的方法,涉及比较简单的转换技巧,需要的朋友可以参考下...2020-06-25