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.MVC的模板标签系统(三)
Sep 05 PHP
一篇不错的PHP基础学习笔记
Mar 18 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php将数组转换成csv格式文件输出的方法
Mar 14 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 09 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 PHP
通过代码实例解析PHP session工作原理
Dec 11 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安全配置
2006/12/06 PHP
PHP n个不重复的随机数生成代码
2009/06/23 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
php技巧小结【推荐】
2017/01/19 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
[01:18:35]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第一场 1月29日
2021/03/11 DOTA
Python素数检测实例分析
2015/06/15 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
元旦红领巾广播稿
2014/02/19 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
公司节能减排倡议书
2014/05/14 职场文书
个人综合鉴定材料
2014/05/23 职场文书
python - timeit 时间模块
2021/04/06 Python
解决golang 关于全局变量的坑
2021/05/06 Golang
Redis 哨兵集群的实现
2021/06/18 Redis
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏