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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
通过文字传递创建的图形按钮
Oct 09 PHP
php下mysql数据库操作类(改自discuz)
Jul 03 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
页面利用渐进式JPEG来提升用户体验度
Dec 01 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
php封装的表单验证类完整实例
Oct 19 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
CodeIgniter框架基本增删改查操作示例
Mar 23 PHP
php7性能提升的原因详解
Oct 13 PHP
Yii框架小部件(Widgets)用法实例详解
May 15 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP执行linux命令常用函数汇总
2016/02/02 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
vue filters的使用详解
2018/06/11 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
Python 用户登录验证的小例子
2013/03/06 Python
Python中的匿名函数使用简介
2015/04/27 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
解决pip install psycopg2出错问题
2020/07/09 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
世界上最大的各式箱包网络零售店:eBag
2016/07/21 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
运动会广播稿20字
2014/02/18 职场文书
民事申诉状范本
2015/05/20 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技