这里有新鲜出炉的 PHP 设计模式,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
下面小编就为大家带来一篇 php 中将 print_r 处理后的数据还原为原始数组的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考
PHP print_r 方法可以把变量打印显示,使变量易于理解。如果变量是 string,integer 或 float,将打印变量值本身,如果变量是 array,将会按照一定格式显示键和元素。object 与数组类似。print_r 用于打印数组较多。
php 原生没有把 print_r 方法打印后的数据还原为原始数组,因此写了下面这个方法,实现将 print_r 处理后的数据还原为原始数组。
RestorePrint.class.php
- <?php
- /**
- * 将print_r处理后的数据还原为原始数组
- * Date: 2016-10-31
- * Author: fdipzone
- * Ver: 1.0
- */
- class RestorePrint{ // class start
- public $res = array();
- protected $dict = array();
- protected $buf = '';
- protected $keyname = '';
- protected $stack = array();
- public function __construct() {
- $this->stack[] =& $this->res;
- }
- public function __call($method, $param){
- echo $this->buf .' not defined mehtod:'.$method. ' param:'.implode(',', $param);
- }
- public function set($word, $value=''){
- if(is_array($word)){
- foreach($word as $k=>$v){
- $this->set($k, $v);
- }
- }
- $p =& $this->dict;
- foreach(str_split($word) as $ch){
- if(!isset($p[$ch])){
- $p[$ch] = array();
- }
- $p =& $p[$ch];
- }
- $p['val'] = $value;
- return $this;
- }
- public function parse($str){
- $this->doc = $str;
- $this->len = strlen($str);
- $i = 0;
- while($i < $this->len){
- $t = $this->find($this->dict, $i);
- if($t){
- $i = $t;
- $this->buf = '';
- }else{
- $this->buf .= $this->doc{$i++};
- }
- }
- }
- protected function find(&$p, $i){
- if($i >= $this->len){
- return $i;
- }
- $t = 0;
- $n = $this->doc{$i};
- if(isset($p[$n])){
- $t = $this->find($p[$n], $i+1);
- }
- if($t){
- return $t;
- }
- if(isset($p['val'])){
- $arr = explode(',', $p['val']);
- call_user_func_array(array($this, array_shift($arr)), $arr);
- return $i;
- }
- return $t;
- }
- protected function group(){
- if(!$this->keyname){
- return ;
- }
- $cnt = count($this->stack)-1;
- $this->stack[$cnt][$this->keyname] = array();
- $this->stack[] =& $this->stack[$cnt][$this->keyname];
- $this->keyname = '';
- }
- protected function brackets($c){
- $cnt = count($this->stack)-1;
- switch($c){
- case ')':
- if($this->keyname){
- $this->stack[$cnt][$this->keyname] = trim($this->buf);
- }
- $this->keyname = '';
- array_pop($this->stack);
- break;
- case '[':
- if($this->keyname){
- $this->stack[$cnt][$this->keyname] = trim($this->buf);
- }
- break;
- case ']':
- $this->keyname = $this->buf;
- break;
- }
- $this->buf = '';
- }
- } // class end
- ?>
demo.php
- <?php
- require 'RestorePrint.class.php';
- $print_r_data = <<<TXT
- Array
- (
- [name] => fdipzone
- [gender] => male
- [age] => 18
- [profession] => programmer
- [detail] => Array(
- [grade] => 1
- [addtime] => 2016-10-31
- )
- )
- TXT;
- // 显示打印的数据
- echo '显示打印的数据<br>';
- echo '<pre>'.$print_r_data.'</pre>';
- $oRestorePrint = new RestorePrint;
- $oRestorePrint->set('Array', 'group');
- $oRestorePrint->set(' [', 'brackets,[');
- $oRestorePrint->set('] => ', 'brackets,]');
- $oRestorePrint->set(')', 'brackets,)');
- $oRestorePrint->parse($print_r_data);
- $result = $oRestorePrint->res;
- echo '还原为数组<br>';
- var_dump($result);
- ?>
输出:
显示打印的数据
Array
(
[name] => fdipzone
[gender] => male
[age] => 18
[profession] => programmer
[detail] => Array(
[grade] => 1
[addtime] => 2016-10-31
)
)
还原为数组
array (size=5)
'name' => string 'fdipzone' (length=8)
'gender' => string 'male' (length=4)
'age' => string '18' (length=2)
'profession' => string 'programmer' (length=10)
'detail' =>
array (size=2)
'grade' => string '1' (length=1)
'addtime' => string '2016-10-31' (length=10)
来源: http://www.phperz.com/article/17/0806/341540.html