php将print_r处理后的数据还原为原始数组的解决方法


Posted in PHP onNovember 02, 2016

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Php+SqlServer实现分页显示
Oct 09 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
简单实用的.net DataTable导出Execl
Oct 28 PHP
使用PHPExcel操作Excel用法实例分析
Mar 26 PHP
php计算到指定日期还有多少天的方法
Apr 14 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
Sep 29 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
PHP中散列密码的安全性分析
Jul 26 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 #PHP
php 使用redis锁限制并发访问类示例
Nov 02 #PHP
Android AsyncTack 异步任务实例详解
Nov 02 #PHP
php array_pop 删除数组最后一个元素实例
Nov 02 #PHP
PHP设置images目录不充许http访问的方法
Nov 01 #PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 #PHP
php获得文件夹下所有文件的递归算法的简单实例
Nov 01 #PHP
You might like
PHP4引用文件语句的对比
2006/10/09 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
JavaScript错误处理
2015/02/03 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
Python 文件操作实现代码
2009/10/07 Python
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
Django csrf 验证问题的实现
2018/10/09 Python
一百行python代码将图片转成字符画
2021/02/19 Python
python hough变换检测直线的实现方法
2019/07/12 Python
python3下pygame如何实现显示中文
2020/01/11 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
歌咏比赛主持词
2015/06/29 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
Python极值整数的边界探讨分析
2021/09/15 Python
Python编程源码报错解决方法总结经验分享
2021/10/05 Python