PHP循环判断字符串是否包含数组的值

 更新时间:2016年11月25日 15:39  点击:2119
下面来看一个利用foreach遍历数组之后再判断数组值是否在字符串中出现过,具体操作代码如下图所示。

例子

 代码如下 复制代码

<?php
function is_exist($str,$key){
 foreach($key as $v){
  if(strpos($str,$v)>-1){
   return true;
  }
 }
 return false;
}
$str = 'abcdefg我们中国';
$key = array('4','5','a');
if(is_exist($str,$key)){
 echo 'YES';
}
else{
 echo 'NO';
}
?>

原理分析

很简单的一个例子我们只要使用foreach遍历数组的值之后再使用strpos($str,$v)>-1来判断数组值是不是在字符串中指定位置了,如果搜索到了就会返回大于或等于0值哦。

今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧。

今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧。

例子

 代码如下 复制代码

$imgs = array();
$imgs[0] = '1.jpg';
$imgs[1] = '2.jpg';
$imgs[2] = '3.jpg';
$imgs[3] = '4.jpg';
$target = 'emp.jpg';//背景图片
$target_img = Imagecreatefromjpeg($target);
$source= array();
foreach ($imgs as $k=>$v){
    $source[$k]['source'] = Imagecreatefromjpeg($v);
    $source[$k]['size'] = getimagesize($v);
}
//imagecopy ($target_img,$source[0]['source'],2,2,0,0,$source[0]['size'][0],$source[0]['size'][1]);
//imagecopy ($target_img,$source[1]['source'],250,2,0,0,$source[1]['size'][0],$source[1]['size'][1]);
$num1=0;
$num=3; //控制列数,一行几列,0为1以此类推。
$tmp=2;
$tmpy=2; //图片之间的间距
for ($i=0; $i<4; $i++){
    imagecopy($target_img,$source[$i]['source'],$tmp,$tmpy,0,0,$source[$i]['size'][0],$source[$i]['size'][1]);
    $tmp = $tmp+$source[$i]['size'][0];
    $tmp = $tmp+5;
    if($i==$num){
        $tmpy = $tmpy+$source[$i]['size'][1];
        $tmpy = $tmpy+5;
        $tmp=2;
        $num=$num+3;
    }
}
Imagejpeg($target_img,'pin.jpg');
?>

<img src="pin.jpg">

定时任务执行php程序有两方法,一种是ignore_user_abort来实现定时操作,另一种是利用系统自带的计划任务来操作,如linux中使用Crontab,夼windows机器使用任务计划即可。

下面是网上比较流行的纯PHP实现定时任务的代码,我把他整理完善了下,不过先别急着用,一定要看到最下面。

 代码如下 复制代码

<?php
ignore_user_abort(); // 关掉浏览器,PHP脚本也可以继续执行
set_time_limit(600); // 设置程序的执行时间为600秒
// set_time_limit(0); // 设置程序的执行时间为无限长
$interval = 5; // 每隔5秒运行

do {
    $fp = fopen('sjyhome.txt', 'a'); // 打开 sjyhome.txt
    fwrite($fp, '欢迎来到SJY之家 www.111cn.net'); // 往 sjyhome.txt 写入信息
    fclose($fp); // 关闭 sjyhome.txt
    sleep($interval); // 等待5秒
} while (true);
?>

上面的代码是死循环,即使删除代码文件也无济于事,必须重启WEB才能停止脚本执行。所以我们需要一个执行脚本的开关,我们可以用外部文件引入的方法来实现,在while循环的时候,include开关变量即可。
建立外部引入变量文件 switch.php  内容如下:

 代码如下 复制代码
<?php
return 1;//1执行脚本 0退出执行脚本
?>
改良版的PHP代码
<?php
ignore_user_abort(); // 关掉浏览器,PHP脚本也可以继续执行
set_time_limit(600); // 设置程序的执行时间为600秒
// set_time_limit(0); // 设置程序的执行时间为无限长
$interval = 5; // 每隔5秒运行
$switch = include 'switch.php';
while($switch){
    $fp = fopen('sjyhome.txt', 'a'); // 打开 sjyhome.txt
    fwrite($fp,'欢迎来到SJY之家 www.111cn.net $switch \n'); // 往 sjyhome.txt 写入信息
    fclose($fp); // 关闭 sjyhome.txt
    sleep($interval); // 等待5秒
    $switch = include 'switch.php';
}
exit();
?>

把switch.php文件中的return值改为0,则会自动停止运行。想要再次执行,必须把值改为1,并且打开浏览器再执行一次。
如果$switch值为1,那么即使不设置ignore_user_abort(),关闭浏览器照样无法停止循环,甚至删除代码文件也没用,只能等待超时(默认30秒,set_time_limit自定义执行时间)重启WEB服务。
写在后面的话
本方法纵然可以实现定时功能,可是一旦运行该代码文件,这个进程就一直都在了,对于服务器资源的消耗我没测试过,不过有些空间商或许不会允许长时间占线的进程。
如果自己有VPS或服务器的朋友,建议在服务器中做好计划任务,来执行你网站上的脚本


下面介绍使用Linux中的Crontab来实现的两种方法。

关于crontab的使用,可参考文章:Linux计划任务crontab详解
一、在Crontab中使用PHP执行脚本
就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。
每一小时执行myscript.php如下:

 代码如下 复制代码
#crontab -e
00 * * * * /usr/local/bin/php /home/web/3aj.php
/usr/local/bin/php为PHP程序的路径。

二、在Crontab中使用URL执行脚本
如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。
下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。
00 * * * * lynx -dump http://你的网址/script.php
下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用”curl -o”选项,你也可以把脚本的输出转储到临时文件。
*/5 * * * * /usr/bin/curl -o temp.txt http://你的网址/script.php
下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。”-O temp.txt”表示输出会发送到临时文件。
*/10 * * * * /usr/bin/wget -q -O temp.txt http://你的网址/script.php
再介绍一下在Windows下php计划任务的实现

1、新建一个3aj.php,内容如下:

 代码如下 复制代码
<?
$fp = fopen("3aj.txt", "a+");
fwrite($fp, date("Y-m-d H:i:s") . " 成功了!\n");
fclose($fp);
?>

2、新建3aj.bat文件,内容如下:
C:\php\php.exe -q D:\web\3aj.php
3、建立WINDOWS计划任务:
开始–>控制面板–>任务计划–>添加任务计划
浏览文件夹选择上面的3aj.bat文件
设置时间和密码(登陆WINDOWS的保存即可了。
4、右键点击计划任务 -> “运行”即可

PHP CURL与file_get_contents函数都可以获取远程服务器上的文件保存到本地,但在性能上面两者完全不在同一个级别,下面我先来介绍PHP CURL或file_get_contents函数应用例子,然后再简单的给各位介绍一下它们的一些小区别吧。

推荐方法 CURL获取

 代码如下 复制代码

<?php
$c = curl_init();
$url = 'www.111cn.net';
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($c);
curl_close($c);
$pos = strpos($data,'utf-8');
if($pos===false){$data = iconv("gbk","utf-8",$data);}
preg_match("/<title>(.*)<\/title>/i",$data, $title);
echo $title[1];
?>


使用file_get_contents

 代码如下 复制代码

<?php
$content=file_get_contents("http://www.111cn.net/");
$pos = strpos($content,'utf-8');
if($pos===false){$content = iconv("gbk","utf-8",$content);}
$postb=strpos($content,'<title>')+7;
$poste=strpos($content,'</title>');
$length=$poste-$postb;
echo substr($content,$postb,$length);
?>

看看file_get_contents性能

1)fopen/file_get_contents 每次请求远程URL中的数据都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS 查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen/file_get_contents 好很多。
2)fopen/file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。(设置header头应该可以)
3)fopen/file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
4)curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen/file_get_contents只能使用get方式获取数据。
5)fopen/file_get_contents 不能正确下载二进制文件
6)fopen/file_get_contents 不能正确处理ssl请求
7)curl 可以利用多线程
8)使用 file_get_contents 的时候如果 网络出现问题, 很容易堆积一些进程在这里
9)如果是要打一个持续连接,多次请求多个页面。那么file_get_contents就会出问题。取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。对做采集抓取的用curl,如果还有同不相信下面我们再做个测试

curl与file_get_contents性能对比PHP源代码如下:
1829.php

 代码如下 复制代码
<?php
/**
 
* 通过淘宝IP接口获取IP地理位置
 
* @param string $ip
 
* @return: string
 
**/
function getCityCurl($ip)
{
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
    $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);
 
    $ipinfo=json_decode($file_contents);
    if($ipinfo->code=='1'){
        return false;
    }
    $city = $ipinfo->data->region.$ipinfo->data->city;
    return $city;
}
 
function getCity($ip)
{
    $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
    $ipinfo=json_decode(file_get_contents($url));
    if($ipinfo->code=='1'){
        return false;
    }
    $city = $ipinfo->data->region.$ipinfo->data->city;
    return $city;
}
 
// for file_get_contents
$startTime=explode(' ',microtime());
$startTime=$startTime[0] + $startTime[1];
for($i=1;$i<=10;$i++)
{
   echo getCity("121.207.247.202")."</br>";
}
$endTime = explode(' ',microtime());
$endTime = $endTime[0] + $endTime[1];
$totalTime = $endTime - $startTime;
echo 'file_get_contents:'.number_format($totalTime, 10, '.', "")." seconds</br>";
 
//for curl
$startTime2=explode(' ',microtime());
$startTime2=$startTime2[0] + $startTime2[1];
for($i=1;$i<=10;$i++)
{
   echo getCityCurl('121.207.247.202')."</br>";
}
$endTime2 = explode(' ',microtime());
$endTime2=$endTime2[0] + $endTime2[1];
$totalTime2 = $endTime2 - $startTime2;
echo "curl:".number_format($totalTime2, 10, '.', "")." seconds";
?>

测试访问

file_get_contents速度:4.2404510975 seconds
curl速度:2.8205530643 seconds

curl比file_get_contents速度快了30%左右,最重要的是服务器负载更低.

一个简单好用的Php自用分页函数,有需要使用分页函数又不想手写的朋友可进入参考。
 代码如下 复制代码
/*
 * 前台分页
 *
 * $page_array = array(
 *  'totle'     =>10,    //总数
 *  'dispage'   =>10,    //每页显示条数
 *  'url'       =>'/article/list/',//url地址
 *  'now_page', =>1, //当前所在页数
 * );
 *
* @return   pagenav
*/
function front_page( $page_array ){
 
    //分页判断
    $lastpage = ceil($page_array['total'] / $page_array['dispage']); //最后一页
    $page_array['now_page'] = min( $lastpage , $page_array['now_page'] );//比较当前页数和最后一页
    $prepage = $page_array['now_page'] - 1;//上一页
    $nextpage = ($page_array['now_page'] == $lastpage ? 0 : $page_array['now_page'] + 1 );//下一页
    $firstcount = ($page_array['now_page']-1) * $page_array['dispage'];
    if( $lastpage <= 1) return false;//最后一页小于1,则直接返回
 
    //首页
    if($prepage){
        $page_array[]="<a href='{$page_array['url']}"."1/'>首页</a>";
    }else{
        $page_array[]="<span class=\"nolink\">首页</span>";
    }
    //上一页
    if($prepage) {
        $page_array[]="<a  href='{$page_array['url']}$prepage/'> 上一页 </a> ";
    }else{
        $page_array[]='';
    }
 
    //显示的数字分页条数
    $pagenum=5;
    $offset=2;//偏移两
    $from=$page_array['now_page'] - $offset;//起始
    $to=$page_array['now_page'] + $pagenum-$offset-1;//终止
    if($pagenum>$lastpage){
        $from=1;
        $to=$lastpage;
    }else{
        if($from<1){
            $to=$page_array['now_page'] + 1 - $from;
            $from=1;
            if(($to-$from)<$pagenum && ($to-$from)<$lastpage){
                $to=$pagenum;
            }
        }elseif($to>$lastpage){
            $from=$page_array['now_page'] - $lastpage+$to;
            $to=$lastpage;
            if(($to-$from)<$pagenum && ($to-$from)<$lastpage){
                $from=$lastpage-$pagenum+1;
            }
        }
    }
    for($i=$from;$i<=$to;$i++){
        if($i == $page_array['now_page']){
            $pagenav.="<a href=\"#\" title=\"\">$i</a> ";
        }else{
            $pagenav.="<a href=\"{$page_array['url']}$i/\" title=\"\">$i</a> ";
 
        }
    }
    //数字分页
    $page_array[]= $pagenav;
    //下一页
    if($nextpage){
        $page_array[]="<a href='{$page_array['url']}"."$nextpage/'> 下一页 </a> ";
    }else {
        $page_array[]='';
    }
    //尾页
    if($nextpage){
        $page_array[]="<a href='{$page_array['url']}"."$lastpage/'>尾页</a>";
    }else{
        $page_array[]='<span class="nolink">尾页</span>';
    }
    //记录数
    $page_array[]="<span>每页   ".$page_array['dispage']."  条</span> <span>共  ".$page_array['total']."  条纪录</span>";
    //分页数
    $page_array[]="共  ".$lastpage." 页";
 
    //跳页
    $page_array[] = '<span>跳转到:</span><input size="4" id="pagenu" type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value<0)?1:this.value;location=\''.$page_array['url'].'\'+page;}" />
                    <a href="javascript:void(0)" onclick="javascript:var spage=(window.document.getElementById(\'pagenu\').value==\'\')?1:window.document.getElementById(\'pagenu\').value;location=\''.$page_array['url'].'\'+spage;">Go</a>';
    //第一页总数
    $firstcount=$firstcount < 1 ? 0 : $firstcount;
    return array('pagenav'=>$page_array,'limit'=>$firstcount,'offset'=> $page_array['dispage'],'allpage'=>$lastpage);
}
[!--infotagslink--]

相关文章

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

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php数组操作 键名比较 差集 交集赋值

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

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 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
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • c# 判断是否为空然后赋值的4种实现方法

    下面小编就为大家分享一篇c# 判断是否为空然后赋值的4种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • C# 拷贝数组的几种方法(总结)

    下面小编就为大家带来一篇C# 拷贝数组的几种方法(总结)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25