在php中我给大家介绍两个比较常用的数组过滤函数array_filter与array_unique了,一个是过滤数组空值,一个是过滤数组重复值,我们现在一起来看看。
语法
array_filter(array,function)
参数 描述
array 必需。规定输入的数组。
function 自定义函数的名称,为空时过滤掉所有值为flase的元素
代码如下 |
复制代码 |
<?php
function odd($var) {
return($var & 1);
}
function even($var) {
return(!($var & 1));
}
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
echo "Odd :n";
print_r(array_filter($array1, "odd"));
echo "Even:n";
print_r(array_filter($array2, "even"));
/*
Odd :
Array
(
[a] => 1
[c] => 3
[e] => 5
)
Even:
Array
(
[0] => 6
[2] => 8
[4] => 10
[6] => 12
)
*/
|
过滤掉PHP数组中的重复值
去除一个数组中的重复值,可以使用foreach方法,也可以使用array_unique方法,下面的代码两种方法都使用了
代码如下 |
复制代码 |
<?php
$arrF = array();
$arrS = array();
$intTotal = 100;
$intRand = 10;
for($i=0; $i < $intTotal; $i++)
{
$arrF[] = rand(1, $intRand);
$arrS[] = rand(1, $intRand);
}
$arrT = array_merge($arrF, $arrS);
$arrRF = array();
$intStart = time();
foreach($arrT as $v)
{
if(in_array($v, $arrRF))
{
continue;
}
else
{
$arrRF[] = $v;
}
}
$intEnd = time();
$intTime = $intEnd-$intStart;
echo "With Continue,Spend time:$intTime<br/>";
$intStart1 = time();
$arrRS = array_unique($arrT);
$intEnd2 = time();
$intTime2 = $intEnd2-$intStart1;
echo "With array_unique function,Spend time:($intTime2)";
echo "<pre>";
print_r($arrT);
print_r($arrRF);
print_r($arrRS);
echo "</pre>";
?>
|
在$intTotal比较小的情况下,比如说1000以内,$intRand的取值基本不影响结果,两者执行的时间都差不多。
测试$intTotal 大于10000时,$intRand取值100时,使用array_unique的效率要高于foreach循环判断,$intRand=10,两者执行时间一致。
因此,可以得出结论,当数组容量不大,大概在1000以内时,使用两者的执行效率差不多。
当数组容量比较大时(具体应该到什么值,我没有详细测试,感兴趣的可以确定一下这个值),随着$intRand的逐渐增大,array_unique的表现更好,我不使用$intTotal/$intRand这个比值,是因为,感觉并不是成比例变化,但是基本会遵循比值越大,array_unique表现越好。
综上所述,在过滤数组重复值的时候,建议使用array_unuique,数组不大的时候两者效率等同,而array_unique使用当然让你的代码一下子减了好几行,数组容量过大时,函数的表现更好
二维数组去重复项函数
PHP数组去除重复项 有个内置函数array_unique (),但是php的 array_unique函数只适用于一维数组,对多维数组并不适用,以下提供一个二维数组 的 array_unique函数
代码如下 |
复制代码 |
function unique_arr($array2D,$stkeep=false,$ndformat=true)
{
// 判断是否保留一级数组键 (一级数组键可以为非数字)
if($stkeep) $stArr = array_keys($array2D);
// 判断是否保留二级数组键 (所有二级数组键必须相同)
if($ndformat) $ndArr = array_keys(end($array2D));
//降维,也可以用implode,将一维数组转换为用逗号连接的字符串
foreach ($array2D as $v){
$v = join(",",$v);
$temp[] = $v;
}
//去掉重复的字符串,也就是重复的一维数组
$temp = array_unique($temp);
//再将拆开的数组重新组装
foreach ($temp as $k => $v)
{
if($stkeep) $k = $stArr[$k];
if($ndformat)
{
$tempArr = explode(",",$v);
foreach($tempArr as $ndkey => $ndval) $output[$k][$ndArr[$ndkey]] = $ndval;
}
else $output[$k] = explode(",",$v);
}
return $output;
}
测试
$array2D = array('first'=>array('title'=>'1111','date'=>'2222'),'second'=>array('title'=>'1111','date'=>'2222'),'third'=>array('title'=>'2222','date'=>'3333'));
print_r($array2D);
print_r(unique_arr($array2D,true));
|
由于N久之前做了一些非常不好的动作导致网站内容页面有一些垃圾数据,今天早上整了一个移除字符串超链接文本方法,下面我结合正则来处理。
下面实例的功能是过滤所有的html标签,并替换h1-h5之前的所有文字
代码如下 |
复制代码 |
for( $i=1;$i<=5;$i++ )
{
$sql ="SELECT * FROM `表名` WHERE `字段` like '<h".$i.">%</h".$i.">%' ";
$query = mysql_query( $sql ) or die(mysql_error());
if( mysql_num_rows( $query ) )
{
while ( $rs = mysql_fetch_array( $query ) )
{
//print_r($rs);
$t = stripslashes($rs['字段']);
$str = nl2br(strip_tags(addslashes(removelink($t))));
$sql ="update 表名 set 字段='$str' where id=".$rs['id'];
if( mysql_query($sql))
{
echo $rs['id'].'成功<br />';
}
else
{
echo mysql_error();
}
}
}
else
{
echo '己更新过没有记录了'.$sql.'<br />';
}
}
function removelink($t)
{
//$str = preg_replace("/<a[^>]*href=[^>]*>|</[^a]*a[^>]*>/i","",$t);
$str = preg_replace("/(?is)(?<=<h1>).*?(?=</h1>)/i","",$t);
$str = preg_replace("/(?is)(?<=<h2>).*?(?=</h2>)/i","",$str);
$str = preg_replace("/(?is)(?<=<h3>).*?(?=</h3>)/i","",$str);
$str = preg_replace("/(?is)(?<=<h4>).*?(?=</h4>)/i","",$str);
$str = preg_replace("/(?is)(?<=<h5>).*?(?=</h5>)/i","",$str);
return re_h($str);
}
function re_h($str)
{
$str = str_replace('<h1>','',$str);
$str = str_replace('<h2>','',$str);
$str = str_replace('<h3>','',$str);
$str = str_replace('<h4>','',$str);
$str = str_replace('<h5>','',$str);
$str = str_replace('</h1>','',$str);
$str = str_replace('</h2>','',$str);
$str = str_replace('</h3>','',$str);
$str = str_replace('</h4>','',$str);
$str = str_replace('</h5>','',$str);
return $str;
}
|
上面用到了下面的正则表达式
代码如下 |
复制代码 |
preg_replace("/(?is)(?<=<h1>).*?(?=</h1>)/i","",$t);
|
这就是核心代码了
比如需要将文本中的超链接内容去除,这个时候就需要用到正则表达式了。比如你可以用$str = preg_replace("/<a[^>]*href=[^>]*>|</[^a]*a[^>]*>/i","",$strhtml); 这段来实现需求,如果想要更多解决方法,可以参看以下的。
1、删除内容中的超链接
代码如下 |
复制代码 |
ereg_replace('<a([^>]*)>([^<]*)</a>','<font color="red">\2</font>',$content);
ereg_replace("<a [^>]*>|</a>","",$content);
|
2、消除包含特定词的超链接
代码如下 |
复制代码 |
$find="this string is my find";
$string='<font color="red">替换掉了</font>';//将超链接替换成的内容
echo ereg_replace('<a([^>]*)>([^<]*'.$find.'[^>]*)</a>','<font color="red">\2</font>',$content);
|
本站原创,转载必须注明来源www.111cn.net 否则后果自负
利用php curl发送json数据与curl post其它数据是一样的,下面我来给大家总结几个关于curl post发送json数据实例,希望能加深各位对curl post json数据的理解吧。
例1
代码如下 |
复制代码 |
$data = array("name" => "Hagrid", "age" => "36");
$data_string = json_encode($data);
$ch = curl_init('http://api.local/rest/users');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
|
例2
代码如下 |
复制代码 |
function http_post_data($url, $data_string) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data_string))
);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return array($return_code, $return_content);
}
$url = "http://xx.xx.cn";
$data = json_encode(array('a'=>1, 'b'=>2));
list($return_code, $return_content) = http_post_data($url, $data);
|
例3
代码如下 |
复制代码 |
$data=' {
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"click",
"name":"hello word",
"key":"V1001_HELLO_WORLD"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}';
$ch = curl_init($urlcon); //请求的URL地址
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//$data JSON类型字符串
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($data)));
$data = curl_exec($ch);
print_r($data);//创建成功返回:{"errcode":0,"errmsg":"ok"}
|
小结,我们发现最核心的一句代码就是Content-Type: application/json;这个是文件格式类型了。
checkbox在html中是以数组形式存储的,如果我们要获取用户选择了我个checkbox值我们可以利用遍历或直接把数组利用implode转换在字符进行存储。
php要求同名表单元素用数组形式命名,并赋予value。否则他不能分解。
例1:利用foreach遍历checkbox
代码如下 |
复制代码 |
<input type=checkbox name="chk[]" value=1>
<input type=checkbox name="chk[]" value=2>
<input type=checkbox name="chk[]" value=3>
|
提交后,用$_POST['chk']访问。数组中的元素为选中的复选框的值
PHP代码:
代码如下 |
复制代码 |
<?php
foreach( $_POST["chk"] as $i=>$a )
{ echo $i."==>".$a."<br />"; }
//或者使用$_POST["chk"][0]单独使用
?>
|
结果:
0=>1
1=>2
2=>3
例2利用explode
代码如下 |
复制代码 |
<table> <form action="index.php" method="post"> <tr> <td> <ol> <li><input type="checkbox" name="lang[]" id="lang" value="1" />中文普通话</li> <li><input type="checkbox" name="lang[]" id="lang" value="11" />日语</li> <li><input type="checkbox" name="lang[]" id="lang" value="10" />朝鲜语</li> <li><input type="checkbox" name="lang[]" id="lang" value="9" />西班牙语</li> <li><input type="checkbox" name="lang[]" id="lang" value="8" />俄语</li> <li><input type="checkbox" name="lang[]" id="lang" value="7" />德语</li> <li><input type="checkbox" name="lang[]" id="lang" value="6" />法语</li> <li><input type="checkbox" name="lang[]" id="lang" value="5" />英语</li> <li><input type="checkbox" name="lang[]" id="lang" value="4" />少数民族语言</li> <li><input type="checkbox" name="lang[]" id="lang" value="3" />中文闽南语</li> <li><input type="checkbox" name="lang[]" id="lang" value="2" />中文粤语</li> <li><input type="checkbox" name="lang[]" id="lang" value="12" />其它国家语言</li> </ol> </td> </tr> <tr> <td> <input name="submit" type="submit" value="submit" /> </td> </tr> </form> </table> <?php $CACHE['lang'] = array( '1'=>'中文普通话', '11'=>'日语', '10'=>'朝鲜语', '9'=>'西班牙语', '8'=>'俄语', '7'=>'德语', '6'=>'法语', '5'=>'英语', '4'=>'少数民族语言', '3'=>'中文闽南语', '2'=>'中文粤语', '12'=>'其它国家语言', ); $lang = $_POST['lang']; if (is_array($lang)){ $cbsports = '<ol>'; foreach ($CACHE['lang'] as $key => $val) { $cbsports .= '<li><input type="checkbox" name="lang[]" id="lang" value="'.$key.'" '.(in_array($key,$lang) ? 'checked="checked"' : '').' />'.$val.'</li>'; } $cbsports .= '</ol>'; echo $cbsports; } else { echo '请勾选后提交'; } ?>
|
如果需要保存到数据库,按照下面的方式处理后,把$expr的值存储即可。
代码如下 |
复制代码 |
if(!emptyempty($lang)) { $expr = join(",", $lang); }
|
显示的时候再这样处理后就可以重新生成原来的数组。
代码如下 |
复制代码 |
$lang = explode(',',$row(lang));
|
备注:使用serialize() 和unserialize() 可以直接存储数组,不过字段要text类型,不太理想。
例3、需要同时删除多项,或同时修改多项记录
要点:
1,前端表单中name要加[],如:<input type="hidden" name="id[]" value="{$vo.id}">
2,后端接受如:$id = $_POST [id] [$i]; $i为for中的循环变量,当$i相同时可以使得$_POST [id] [$i]和$_POST [name] [$i]为一一对应;
一,前端表单:
代码如下 |
复制代码 |
<form name="form1" method="post" action="__GROUP__/Repair/updateList">
对所选操作:<input type="submit" value="保 存" class="btn btn-primary"> <br>
<table id="checkList" class="list table table-hover">
<tr>
<th scope="col"><input id="check" type="checkbox"
onclick="checkAll()" /> 全选</th>
<th scope="col">主题</th>
<th scope="col">校区</th>
<th scope="col">房间</th>
<th scope="col">报修人</th>
<th scope="col">联系电话</th>
<th scope="col">报修时间</th>
<th scope="col">审核</th>
<th scope="col">报修状态</th>
</tr>
<volist name="list" id="vo">
<tr>
<td><input type="checkbox" name="key" value="{$vo.id}">{$vo.id}<input type="hidden" name="id[]" value="{$vo.id}"></td>
<td>{$vo.topic}</td>
<td>{$vo.xiaoqu}</td>
<td>{$vo.room}</td>
<td>{$vo.pname}</td>
<td>{$vo.phone}</td>
<td>{$vo.create_time|date='Y-m-d H:i:s',###}</td>
<td><select name="check[]"><switch name="vo.check">
<case value="0">
<option value="0" selected="selected">未审核</option>
<option value="1">审核</option>
</case> <default />
<option value="0">未审核</option>
<option value="1" selected="selected">审核</option>
</switch></select></td>
<td><select name="status[]"><switch name="vo.status">
<case value="已修">
<option value="未修">未修</option>
<option value="任务已下">任务已下</option>
<option value="已修" selected="selected">已修</option>
</case> <case value="任务已下">
<option value="未修">未修</option>
<option value="任务已下" selected="selected">任务已下</option>
<option value="已修">已修</option>
</case> <default />
<option value="未修" selected="selected">未修</option>
<option value="任务已下">任务已下</option>
<option value="已修">已修</option>
</switch></select></td>
</tr>
</volist>
</table>
</form>
|
二,服务端处理代码
代码如下 |
复制代码 |
<?php
/**
* 批量修改状态
*/
public function updateList() {
$result = false;
for($i = 0; $i < count ( $_POST [id] ); $i ++) {
$id = $_POST [id] [$i];
$check = $_POST [check] [$i];
$status = $_POST [status] [$i];
// 保存登录信息
$Repair = M ( 'Repair' );
$data ['id'] = $id;
$data ['check'] = $check;
$data ['status'] = $status;
$result = $Repair->save ( $data );
}
if (false !== $result) {
$this->success ( '修改成功!' );
} else {
$this->error ( '修改失败!' );
}
}
|
本文章来给各位同学介绍一个关于PHP重启路由器以更换IP地址程序,如果你对此有兴趣不防进入参考哦。
在采集大批量数据时常常会触发对方服务器的“自我保护”,请求过于频繁就限制访问。这时需要停留很长一段时间(十几分钟到几十分钟不等)才能恢复访问,这样采集数据的速度就受到非常大的限制。
解决方法有两个:
1 通过图片识别绕过验证码机制,告诉服务器:我不是蜘蛛,我是人。不信你瞧,我能看懂验证码。
2 更换IP,告诉服务器:我不是张三,我是李四。不信你瞧,我的IP地址和张三的不一样。
第一个方法难度稍高一点而且不靠谱,等哪天对方服务器升级了验证码了,这边也得跟进,麻烦多;而ISP(电信、联通、移动)那儿有很多IP,每次联网都会分配一个新的IP,因此方法二比较好。
以我的TP-LINK路由器为例,找到“网络参数”>“WAN口设置”,可以看到“自动连接”设置和“断线”按钮。每次点击“断线”按钮,就向ISP重新拨号,此时就换了一个IP。但大批量数据的采集需要的时间比较长,不可能总有人在旁边守着,最好能在PHP代码中,一旦发现被限制了就重启一次,这就回到本文的主题了:《通过PHP函数重启路由器以更换IP》
打开chrome浏览器的调试模式,然后点击“断线”按钮,看“Network”网络请求,可以看到实际执行的地址是:“http://192.168.0.1/userRpm/PPPoECfgRpm.htm?wantype=2&acc=65541234&psw=Hello123World&VnetPap=0&linktype=2&Disconnect=%B6%CF+%CF%DF”
然后模拟请求这个地址,经测试确实可以更换IP地址(通过http://api.akcms.com/myip.php可以看到当前IP)。接下来的就简单了:就用PHP使用Curl组件来实现这个请求的过程,我封装了一个函数resetip,具体代码如下:
代码如下 |
复制代码 |
<?php
//本脚本测试重启路由器的WLAN连接
resetip();
function resetip() {
$username = 'admin';
$password = '123456';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://192.168.0.1/userRpm/PPPoECfgRpm.htm?wantype=2&acc=65541234&psw=Hello123World&VnetPap=0&linktype=2&Disconnect=%B6%CF+%CF%DF');
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
}
?>
|
高亮处需要根据自己的情况修改,路由器地址有的是192.168.1.1,重启地址也各有不同,但大同小异,自己改改。