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字符转义相关函数小结(php下的转义字符串)
Apr 12 PHP
PHP几个数学计算的内部函数学习整理
Aug 06 PHP
PHP中strtotime函数使用方法详解
Nov 27 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
解析PHP工厂模式的好处
Jun 18 PHP
PHP面向对象精要总结
Nov 07 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
一个简单的php路由类
May 29 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
laravel 使用auth编写登录的方法
Sep 30 PHP
PHP7 windows支持
Mar 09 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
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
js实时获取系统当前时间实例代码
2013/06/28 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
python定时器(Timer)用法简单实例
2015/06/04 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
基于python绘制科赫雪花
2018/06/22 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
python第三方库学习笔记
2020/02/07 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
新西兰杂志订阅:isubscribe
2019/08/26 全球购物
Python如何定义一个函数
2015/09/01 面试题
研究生毕业自我鉴定范文
2014/03/27 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
护士旷工检讨书
2015/08/15 职场文书
python实现的web监控系统
2021/04/27 Python
零基础学java之循环语句的使用
2022/04/10 Java/Android
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS