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可逆加密/解密函数分享
Sep 25 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
phplot生成图片类用法详解
Jan 06 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
Json_encode防止汉字转义成unicode的方法
Feb 25 PHP
[原创]smarty简单模板变量输出方法
Jul 09 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
Yii redis集合的基本使用教程
Jun 14 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
COM in PHP (winows only)
2006/10/09 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
js中substring和substr的定义和用法
2014/05/05 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
uniapp实现可滑动选项卡
2020/10/21 Javascript
python中map()与zip()操作方法
2016/02/27 Python
python 数据的清理行为实例详解
2017/07/12 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
python读取xlsx的方法
2018/12/25 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python自动识别文本编码格式代码
2019/12/26 Python
python使用配置文件过程详解
2019/12/28 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
十八届三中全会报告学习材料
2014/02/17 职场文书
《画》教学反思
2014/04/14 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
vue 自定义组件添加原生事件
2022/04/21 Vue.js