php查找数组元素各种方法总结

 更新时间:2016年11月25日 17:29  点击:1775
在php中数据查询可以分类一维数组查找,与多维数组查找了,如果是简单的一维数组我们可以直接使用in_array ,array_search 与遍历来实例了,如果是多维数组就需要使用其它办法。

对于一维数组我们可以如下操作

in_array  '函数在数组中搜索给定的值。in_array(value,array,type)type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

array_key_exists 'array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。array_key_exists(key,array)

array_search 'array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。array_search(value,array,strict)

从这里来看,在数据量不大的时候,比如小于1000,查找用哪一种都行,都不会成为瓶颈;
当数据量比较大的时候,用array_key_exists比较合适。
当然这里array_key_exists占用的内存比较大,经测算

二分法查找数组是否包含某一元素,兼容正反序,代码实现:

 代码如下 复制代码

<?php

$searchValue = (int)$_GET['key'];

function search(array $array, $value)
{
$max = count($array)-1;
$min = 0;
$isAscSort = $array[$min] < $array[$max];

while (TRUE) {
$sum = $min+$max;
$midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);

if ($max < $min) {
return -1;
} else if ($value == $array[$midKey]) {
return 1;
} else if ($value > $array[$midKey]) {
$isAscSort ? $min = $midKey+1 : $max = $midKey-1;
} else if ($value < $array[$midKey]) {
$isAscSort ? $max = $midKey-1 : $min = $midKey+1;
}
}
}

$array = array(
'4', '5', '7', '8', '9', '10', '11', '12'
);
// 正序
echo search($array, $searchValue);

// 逆序
rsort($array);
echo search($array, $searchValue);

例二

PHP 查找数组第i小元素

 代码如下 复制代码

<?php
     #随机选择第i小的数字,用随机快排实现
    
     #交换元素
     function swap(&$arr, $i, $j) {
         $temp = $arr[$i];
         $arr[$i] = $arr[$j];
         $arr[$j] = $temp;
     }
 
     #随机划分
     function randomized_partition(&$arr, $begin, $end) {
         $rand_inx = rand($begin, $end);
         swap($arr, $begin, $rand_inx);
         return partition($arr, $begin, $end);
     }
 
     #划分
     function partition(&$arr, $begin, $end) {
         #以第一个元素作为中枢元素
         $pivot = $begin;
         $low = $begin;
         $high = $end;
 
         while ($low < $high) {
             while ($low < $high && $arr[$low] <= $arr[$pivot]) {
                 $low++;
             }
 
             while ($low < $high && $arr[$high] >= $arr[$pivot]) {
                 $high--;
             }
 
             swap($arr, $low, $high);
         }
 
         #交换中枢元素
         if ($arr[$pivot] < $arr[$low]) {
             $low--;
         }
         swap($arr, $pivot, $low);
         return $low;
     }
 
     #快速排序,此处没用到
     function quick_sort(&$arr, $begin, $end) {
         $q = randomized_partition($arr, $begin, $end);
         if ($q > $begin) {
             quick_sort($arr, $begin, $q - 1);
         }
         if ($q < $end) {
             quick_sort($arr, $q + 1, $end);
         }
     }
 
     #选取第i小的数
     function randomized_select(&$arr, $begin, $end, $i) {
         if ($begin == $end) {
             return $arr[$begin];
         }
 
         $q = randomized_partition($arr, $begin, $end);
         $k = $q - $begin + 1; #k代表小于等于q的元素个数
 
         if ($k == $i) { #如果k=i,说明q就是第i小的元素坐标
             return $arr[$q];
         } else if ($i < $k) { #如果i<k,说明第i小的元素位于q的左边
             return randomized_select($arr, $begin, $q - 1, $i);
         } else { #第i小的元素位于q的右边,此时查找右边的第i-k小的元素
             return randomized_select($arr, $q + 1, $end, $i - $k);
         }
     }
 
     $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);
     $t = randomized_select($arr, 0, count($arr) - 1, 8);
     print_r("The 8th minimum element: {$t}");
     echo "<br>";
     quick_sort($arr, 0, count($arr) - 1);
     print_r($arr);
 ?>

本文章给大家介绍利用txt与php实现随机广告显示调用方法,原理很简单我们把广告文件放到txt文件中,当有用户访问时我们把txt文件载入,然后随机出来.
 代码如下 复制代码
<?php
  #########随机广告显示##########
  function myads(){
  $dir="ads"; #设置存放记录的目录
  //$dir="ads"; #设置存放记录的目录
  $ads="$dir/ads.txt"; #设置广告代码文件
  $log ="$dir/ads.log"; #设置ip记录文件
  
  $ads_lines=file($ads);
  $lines=count($ads_lines);#文件总行数
  
  ####读出广告总数$ads_count和显示次数到数组$display_array########
  $ads_count=0;
  $display_count=0;
  for ($i=0;$i<$lines;$i++){
   if((!strcmp(substr($ads_lines[$i],0,7),"display"))){
   $ads_count+=1;
   $display_array[$ads_count]=substr($ads_lines[$i],8);
   $display_count+=$display_array[$ads_count];
   }
  }
  ####决定随机显示序号$display_rand#####
  srand((double)microtime()*1000000);
  $display_rand = rand(1,$display_count);
  
  ###决定广告序号$ads_num######
  $pricount=0;
  $ads_num=1;
  for($i=1; $i<=$ads_count; $i++) {
   $pricount += $display_array[$i];
   if ($display_rand<=$pricount) {$ads_num=$i;break;}
  }
  
  #####播放广告########
  $num=0;
  $flag=0;
  
  for($i=0;$i<$lines;$i++){
   if((!strcmp(substr($ads_lines[$i],0,7),"display"))){$num++;}
   if(($num==$ads_num)and($flag==0)){$flag=1;continue;}
   if(($flag==1)and strcmp($ads_lines[$i][0],"#")){echo $ads_lines[$i];continue;}
   if(($flag==1)and(!(strcmp($ads_lines[$i][0],"#")))){break;}
  }
  ####纪录广告显示次数#########
  $fp=fopen($log,"a");
  fputs($fp,date( "Y-m-d H:i:s " ).getenv("REMOTE_ADDR")."==>".$ads_num."n");
  fclose($fp);
  }
  ?>

  
广告代码文件ads.txt

 代码如下 复制代码
  
  ########每个广告代码之间用'#'隔开,display为显示加权数,越大显示次数越多################
  ################################
  display=10
  
  <a href="http://www.111cn.net">
  <img src="h/c_banner.gif" alt="Chance2mail,好礼物送给您!"> </a>
  ################################
  display=10
  
  <a href="http://www.111cn.net" target=_blank>
  <img src="8848.gif" width="468" height="60" border="0"></a>

   
  
调用

<?php myads();?>

即可

昨天有一个朋友问题可不可以检查用户提交的数据中是否包括了超级连接,如果有的话就直接过滤了,下面我来给大家介绍过滤连接的办法。

判断一个字符串是否含有超级链接

 代码如下 复制代码

$str="ssdsf<a target='_blank' href='http://www.111cn.net/' >sdf</a>sdfss";
if(preg_match("/<a/s+href=[^>]*>|<//[^a]*a[^>]*>/i",$str))
{
echo "该字符串有超链接";
}
else
{
echo "该字符串没有超链接标记";
}
?>


下面我们只要过滤连接部份。

 代码如下 复制代码

<?php
echo preg_replace("/(?<=href=)([^>]*)(?=>)/i","#", "<a href='www.111cn.net'>你好,点这里看看</a><a href='www.111cn.net'>你好,点这里看看</a>");
?>

正则:/(?<=href=)([^>]*)(?=>)/

(?<=exp) 匹配exp后面的位置
(?=exp) 匹配exp前面的位置
此正则 匹配 在 href= 之后 “>” 之前 的 非 “>” 的所有字符

例子:<a href='www.111cn.net '>

找到这些字符(url)用 # 替换,就可以去掉html里的所有链接。

现在分享一个提取超级连接的实例

 

 代码如下 复制代码

function match_links($document) {   

    preg_match_all("'<s*as.*?hrefs*=s*(["'])?(?(1)(.*?)\1|([^s>]+))[^>]*>?(.*?)</a>'isx",$document,$links);                       

    while(list($key,$val) = each($links[2])) {

        if(!empty($val))

            $match['link'][] = $val;

    }

    while(list($key,$val) = each($links[3])) {

        if(!empty($val))

            $match['link'][] = $val;

    }       

    while(list($key,$val) = each($links[4])) {

        if(!empty($val))

            $match['content'][] = $val;

    }

    while(list($key,$val) = each($links[0])) {

        if(!empty($val))

            $match['all'][] = $val;

    }               

    return $match;

}

下面我来给大家介绍在php正则匹配图片路径原理与实现方法,有需要了解的朋友可进入参考参考。

提取src=里面的图片地址还不足够,因为不能保证那个地址一定是绝对地址,完全的地址,如果那是相对的呢?如果地址诸如:
albums/Candids/thumb_P1050338.jpg
/content/media/touts/5271608/5271654/15320982
那该如何是好?
有时在这些地址前面需要加http://example1.com/ ,有些甚至要加http://example1.com/example2/.../ 于是,要写出出一种法则符合所有要求,简直是天方夜谭。只能见机行事对症下药。有时,需要从前面动刀,有时需要从后面砍断。
今天,我惊讶地知道了一个道理,原来http://example.com/ 和http://example.com////// 是一样的!
http://img3.douban.com/pics/nav/lg_main_a6.png

http://img3.douban.com////pics////nav///lg_main_a6.png
最终你都能到达

 

图片网址规范的html代码无非就是


1 <img src="??" title="??" alt="??" border="??" width="??" height="??" />
??和??是非必需的,若要通过XHTML认证??、??、??、??必不可少。

就正则谈正则的话,我写出的最短匹配是


1 (?<=img.+?src=").*?(?=")
不过,这条在php里不行,会出现:


1 Warning: preg_match_all() [function.preg-match-all]: Compilation failed: lookbehind assertion is not fixed length at offset *** in ***
 纠结了很久,都不行,原因何在呢?试了很多次,终于发现问题在(?<=img.+?src=")这个零宽断言里,在php中,零宽断言里不支持类似“*”、“+”这些无限次的东西,于是报错了,把“.+?”改为定长就好。不过,要“img”和“src=”之间定长基本上是不可能的。通常,图片地址的img和src只会相隔一个很简单的空格,但不排除某些情况在src之前,img后有alt、titlte等东西。

所以


1 (?<=img.src=").*?(?=")

 

1 (?<=imgssrc=").*?(?=")
 

可能可以,但不保证100%没问题。

你也许会问,单纯

 

1 (?<=src=").*?(?=")
不行吗?通常情况,可以,但,搜索过页面的盆友应该知道,除了图片地址用src开头以外,javascript地址也用src开头!而且,太多神通广大的不可预知因素隐含其中,于是这个貌似很简短完美的写法就行不通了。
你又或许会问,聪明简短的不行,我把图片的后缀列出来,总该可以了吧,如


1 (?<=src=").*?.(jpg|jpeg|gif|png|bmp|JPG|JPEG|GIF|PNG|BMP)
的确,这个写法实在是很老实,不过,你见过没有后缀的图片?wwe.com 有很多这种例子呢

RAW http://us.wwe.com/content/media/images/Headers/15559182
SmackDown http://us.wwe.com/content/media/images/Headers/15854138
NXT http://us.wwe.com/content/media/images/Headers/15929136
Superstars http://us.wwe.com/content/media/images/Headers/15815850

上面的网址都是图片,但都没有传统后缀,你老实也没用,还是不能获取到它们。

怎么办呢?还可以这样

 


1 <img(.*?)src="(.*?)(?=")
 和上面的表达式不同,这次的结果中array[0]的内容不是我们想要的,我们要的图片地址在array[2]里。为什么呢?因为我们用了2个 (.*?),每个“()”的东西会自动存在一个组里,而array[0]代表结果的汇总,array[1]包含了img和src里的所有东西,array[2]才轮到我们想要的图片地址。这种匹配方法,既能匹配有传统后缀的图片,也能匹配一些无后缀的图片文件,同时又不会杀错其它src=文件。个人感觉还是不错的,呵呵。当然了,如果你还有更好的建议,请马上留言,全球人民都会感谢你!
你到底要什么样的图片,是固定格式还是其它?得具体情况具体分析呢。
我的建议是:
如果你要的图片地址的格式是img空格src=的,请使用:(?<=img.src=").*?(?=") ,数组唯一,你懂的。
否则,请使用<img(.*?)src="(.*?)(?=") ,记得留意有用内容所在的数组位置哦!


并在项目中使用了很长时间的正则吧.


/<img.*srcs*=s*["|']?s*([^>"'s]*)/i


,我使用kindeditor保存文章,但是需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段.我就是使用上面的正则解决的.

我说明下,上面的地址是直接获取img标签内src属性的值.在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,你可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片.

我的例子:


preg_match_all("/<img.*srcs*=s*["|']?s*([^>"'s]*)/i",str_ireplace("\","",$content),$arr);


呵呵 我的内容部分被php给加上转义了,所以我需要先把去除,str_ireplace("\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.

本文章给大家介绍在php正则表达式解析字符串里的所有URL地址实现代码,有需要了解学习的朋友可进入参考。

分享一个同事写的URL正则表达式,缺点不支持中文URL:

 代码如下 复制代码

(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?

下面介绍一个可以支持中文正则url

 

 代码如下 复制代码
var regexp = new RegExp("(http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&amp;*+?:_/=<>]*)?", "gi");
var urls = textbox.value.match(regexp) || [];//textbox为文本框
console.log(urls);


实例

 代码如下 复制代码

<?php
// $html        = the html on the page
// $current_url = the full url that the html came from (only needed for $repath)
// $repath      = converts ../ and / and // urls to full valid urls
function pageLinks($html, $current_url = "", $repath = false){
    preg_match_all("/<a.+?href=("|')(?!javascript:|#)(.+?)("|')/i", $html, $matches);
    $links = array();
    if(isset($matches[2])){
        $links = $matches[2];
    }
    if($repath && count($links) > 0 && strlen($current_url) > 0){
        $pathi      = pathinfo($current_url);
        $dir        = $pathi["dirname"];
        $base       = parse_url($current_url);
        $split_path = explode("/", $dir);
        $url        = "";
        foreach($links as $k => $link){
            if(preg_match("/^../", $link)){
                $total = substr_count($link, "../");
                for($i = 0; $i < $total; $i++){
                    array_pop($split_path);
                }
                $url = implode("/", $split_path) . "/" . str_replace("../", "", $link);
            }elseif(preg_match("/^///", $link)){
                $url = $base["scheme"] . ":" . $link;
            }elseif(preg_match("/^/|^.//", $link)){
                $url = $base["scheme"] . "://" . $base["host"] . $link;
            }elseif(preg_match("/^[a-zA-Z0-9]/", $link)){
                if(preg_match("/^http/", $link)){
                    $url = $link;
                }else{
                    $url       = $dir . "/" . $link;
                }
            }
            $links[$k] = $url;
        }
    }
    return $links;
}
header("content-type: text/plain");
$url = "http://www.111cn.net";
$html = file_get_contents($url);
// Gets links from the page:
print_r(pageLinks($html));

// Gets links from the page and formats them to a full valid url:
print_r(pageLinks($html, $url, true));

[!--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
  • 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
  • C#实现字符串转换成字节数组的简单实现方法

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

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

    本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
  • 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
  • javascript中去除数组重复元素的实现方法【实例】

    下面小编就为大家带来一篇javascript中去除数组重复元素的实现方法【实例】。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2016-04-16
  • C#中List和数组之间转换的方法

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