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使之能同时支持GIF和JPEG
Oct 09 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP简单预防sql注入的方法
Sep 27 PHP
PHP MYSQL简易交互式站点开发
Dec 27 PHP
浅谈php中变量的数据类型判断函数
Mar 04 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
php过滤敏感词的示例
2014/03/31 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
浅析JavaScript中的类型和对象
2013/11/29 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
Js apply方法详解
2017/02/16 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Python绘制七段数码管实例代码
2017/12/20 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
python实现五子棋小游戏
2020/03/25 Python
Django实现跨域请求过程详解
2019/07/25 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
Python的历史与优缺点整理
2020/05/26 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
幼儿园托班开学寄语
2014/01/18 职场文书
公司运动会策划方案
2014/05/25 职场文书
党支部活动策划方案
2014/08/18 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
改进工作作风心得体会
2016/01/23 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL