PHP 是一门脚本语言,但它很神奇,你用POST一串数字过去,用var_dump()打印出来,你会发现,这串数字的格式是string。
今天,我要做一个功能,把12位数字,如:000000100000
像上面这种以分为单位的数字,一般人看起来很麻烦,所以,我们要处理一下显示成如下的样子
像这样,就看起来方便一点。要怎么处理,我本打算用正则,但/d 是匹配出0-9的数字,我要从新写匹配方式,再三反思,还是用
简单的方式
function transAmt($value) { //将字符串转换成数组 $array = str_split($value); //对数组进行遍历 foreach($array as $key=>$va) { if($va != 0) { $start = $key; break; } } //对字符串组进行分割 $len = strlen($value) - $start; $substr = substr($value,$start,$len); //对数据进行处理,先获取子串的长度 $smallnum = substr($substr,-2,2); $bignum = substr($substr,0,$len-2); return $bignum.".".$smallnum; }
这样就完事了,就是把字符串转换成数组,再操作数组。
这应该算是PHP 操作字符串的惯用手法。
编程的最简单的思路:遇到问题,针对问题提出解决问题的方法,再多个问题总结,得到共同点。
总的来说,就是把面向过程的函数转换成面向对象的类。
strpos() 函数返回字符串在另一个字符串中第一次出现的位置了,但是我们在按官方的手册来测试时发现一直返回false了,那么要如何来解决
STRPOS用法
strpos(string,find,start)
我们看看strpos的一段代码:
//ajax获取分词
public function get_segment_words() {
$title = I('title');
$content = I('content');
$Segment = M('Segment');
$Segment_content = M('Segment_content');
$segment_array = $Segment->getField('id,word');
$setment_words = array();
foreach ($segment_array as $id => $word) {
if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
$segment_words[] = $word;
}
}
$segment_words = array_unique($segment_words);
$segment_words = implode(',', $segment_words);
echo $segment_words;exit; //ajax获取填充
}
注意这句代码:
if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
//TODO
}
如果匹配失败,strpos会返回bool类型的false,这个一定要注意。不然会出现什么情况呢?假如你要匹配的字符正好在第一个位置,对于strpos这个函数来说返回的是0,也就是位置0.这个时候实际上是匹配到了,结果返回0,如果这样判断就错了:
if (!strpos($content, $word))
举个例子:
内容:购物袋范德萨法拉点撒范德萨。
匹配:购物
如果要找内容里面是否有“购物”两个字,strpos会返回0,表示存在“购物”两个字,位置是0.
因此要用false!=strpos($find,$content)来判断匹配是否成功。
文件上传中有一块非常重要的就是安全验证了,如果验证不合理就很容易给一些人把此利用上传非常的黑客文件了,那么对于新学php新手文件上传验证有多了解呢?如果不懂可以看看本文章。最近遇到一个事,把自己坑了好久,我想说说我开始的想法
PHP的上传机制封装的很完全,基本几行代码就能实现,他的实现流程是这样的
UPLOAD到文件到临时目录中?>使用move_uploadde_file()到指定的目录
这就是PHP上传流程,或者你在中途再进行一些验证。例如判断是不是通过upload方式提交的文档,或者文件的扩展是不是我们允许的
等等一系列验证。我给出简单的代码也算是抛砖引玉了。
$targetFolder = '/uploads'; // 定义根目录 if (!empty($_FILES)) { $tempFile = $_FILES['Filedata']['tmp_name']; if(is_uploaded_file($tempFile)) { $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder; $targetFile = rtrim($targetPath,'/') . '/' . $_FILES['Filedata']['name']; $fileTypes = array('jpg','jpeg','gif','png'); // 允许的后缀扩展 $fileParts = pathinfo($_FILES['Filedata']['name']); if (in_array($fileParts['extension'],$fileTypes)) { move_uploaded_file($tempFile,$targetFile); echo '1'; } else { echo '非法上传文档.'; } }else { echo "非法上传文件"; } }
上面的这种方式基本就满足了文件上传。但我需要的不是这样的。
需求:先点击上传文档,然后选择上传文件,JS上传后会返回一个值,显示当前时间戳问名称的文件在文档名称这个框框中。
然后点击提交后,提交表单。
服务器处理提交的表单,对上传的文件进行重命名。
问题也随之而来了,服务器是IIS的,然后它是用的映射的方式实现的虚拟跟目录。
这样的话$_SERVER[‘DOCUMENT_ROOT’]就不在PHP站点的根目录
虽然完成了上传的功能,但无法下载这个文件。从服务器的安全考虑,还是打算把文件放在PHP站点内。
然后我就陷进了一个思维局限中。
再仔细想一想:
为何我不用实现PHP的上传机制的方式在重复一次。
PHP不是将文件先放到临时目录里面吗?然后我为嘛假设JS上传成功后的目录也是一个临时目录,
然后在再一次提交表单的时候进行文件复制。到指定的目录这样就完成了需要的功能。
PHP有一个文件复制函数Copy(); 然后在配合rename()函数。这样就可以完成上传后文件的第二次移动和重命名了。
注意:在window平台下如果复制一个零字节的文件,copy() 将返回 FALSE ,但文件也会被正确复制。
然后PHP在文件处理上,积极的参考了Liunx的文件处理机制。PHP的文件操作效率,这跟I/O对写和操作系统有关。
总结:其实解决问题的方式很多,而且不要给自己画圈从而限定自己的思维。
数组与Json格式其实是非常像了,我们可以利用相关的函数来进行相互转换的,下面来给各位整理一个从mysql读取数据之后再利用php函数转换成json回传,具体如下
数组转Json
<?php header("Content-Type: text/html; charset=utf-8"); $mydb=mysql_connect("localhost","root","root"); if (!$mydb){ die('Could not connect:'. mysql_error()); } $db_selected=mysql_select_db("mysql",$mydb); //$sql = "SELECT * from Person WHERE Lastname='Adams'"; $sql="SELECT * from user"; $result=mysql_query($sql,$mydb); //print_r(mysql_fetch_array($result)); //处理输出数组格式 //$db1=mysql_query("select * from `tb_info`"); /* $arr=array(); while($rows=mysql_fetch_array($db1)){ $key=$rows['id'] $arr[$key] = $rows['qucount'] } */ /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); } $array = array ( 'Name'=>'希亚', 'Age'=>20 ); /* $array=array ( 0 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 1 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 2 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '25', 'name' => '男士', 'province' => '上海', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 3 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '186****1046', ), 4 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '200元的爱玛电动车代金券', 'mobile' => '186****1046', ), 5 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 6 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 7 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 8 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '河南', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 9 => array ( 'icon' => array ( 'hasPhoto' => '0', 'photoPath' => '/resources/v20/images/boy.png', ), 'age' => '24', 'name' => '男士', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), 10 => array ( 'icon' => array ( 'hasPhoto' => '1', 'photoPath' => '/201412/11/11/49/1418269782350A03EA57_c.jpg', ), 'age' => '20', 'name' => '白日做梦', 'province' => '北京', 'lottery' => '100元的爱玛电动车代金券', 'mobile' => '', ), ); */ echo JSON($array); ?>
json对象转成
普通数组 也就是 Array 的最简单方法还是 用 json_decode() 方法,只需要在后面多写一个参数就可以搞定
json_decode($json,true);
这样就可以将 json 转换成数组形式了,key 保持原来格式
$json = ’{“name”:”zhangsan”,”age”:20,”sex”:”nan”}’; print_r(json_decode($json,true));
这样的json数据解析后 就会成为下面这样的数组
Array
(
[name] => zhangsan
[age] => 20
[sex] => nan
)
数组转json 中文字符
<?php $josin=array( '0'=>array( 'name'=>'四海一家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '1'=>array( 'name'=>'四海二家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '2'=>array( 'name'=>'四海三家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '3'=>array( 'name'=>'四海四家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), '4'=>array( 'name'=>'四海五家', 'subname'=>'南阳店', 'agv'=>'5', 'add'=>'新街口地铁站E24号', 'tel'=>'13382041088', ), ); $k=JSON($josin); echo $k; /************************************************************** * * 使用特定function对数组中所有元素做处理 * @param string &$array 要处理的字符串 * @param string $function 要执行的函数 * @return boolean $apply_to_keys_also 是否也应用到key上 * @access public * *************************************************************/ function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { static $recursive_counter = 0; if (++$recursive_counter > 1000) { die('possible deep recursion attack'); } foreach ($array as $key => $value) { if (is_array($value)) { arrayRecursive($array[$key], $function, $apply_to_keys_also); } else { $array[$key] = $function($value); } if ($apply_to_keys_also && is_string($key)) { $new_key = $function($key); if ($new_key != $key) { $array[$new_key] = $array[$key]; unset($array[$key]); } } } $recursive_counter--; } /************************************************************** * * 将数组转换为JSON字符串(兼容中文) * @param array $array 要转换的数组 * @return string 转换得到的json字符串 * @access public * *************************************************************/ function JSON($array) { arrayRecursive($array, 'urlencode', true); $json = json_encode($array); return urldecode($json); }函数可以通过样相关函数找到位置这个问题小编还是第一次听过了,不过这个函数小编测试还真是有效了,下面来看这两段代码
破解什么代码的时候。用到这个代码就最好不过了。马上收藏起来。以后可以使用。下面说说使用这个 PHP获取指定函数定义在哪个文件中 函数的方法。这需要顺便定义一个function XX() 就OK了
使用方法
function a(){ } function_dump('a');
然后就可以了 下面是核心代码
function function_dump($funcname) { try { if(is_array($funcname)) { $func = new ReflectionMethod($funcname[0], $funcname[1]); $funcname = $funcname[1]; } else { $func = new ReflectionFunction($funcname); } } (ReflectionException $e) { echo $e->getMessage(); return; } $start = $func->getStartLine() - 1; $end = $func->getEndLine() - 1; $filename = $func->getFileName(); echo "function $funcname defined by $filename($start - $end)\n"; }