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经典的给图片加水印程序
Dec 06 PHP
PHP 中的批处理的实现
Jun 14 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
May 16 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
Nov 06 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
Laravel5.7 Eloquent ORM快速入门详解
Apr 12 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
分享php邮件管理器源码
2016/01/06 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
javascript常用功能汇总
2015/07/05 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
把pandas转换int型为str型的方法
2019/01/29 Python
python实现堆排序的实例讲解
2020/02/21 Python
python try...finally...的实现方法
2020/11/25 Python
python unichr函数知识点总结
2020/12/16 Python
实习护士自我鉴定
2013/10/13 职场文书
关于旷工的检讨书
2014/02/02 职场文书
高一数学教学反思
2014/02/07 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
协议书模板
2014/04/23 职场文书
我爱我家教学反思
2014/05/01 职场文书
纪律教育月活动总结
2014/08/26 职场文书
计划生育工作汇报
2014/10/28 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL