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 相关文章推荐
从网上搜到的phpwind 0day的代码
Dec 07 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
php 邮件发送问题解决
Mar 22 PHP
Yii实现自动加载类地图的方法
Apr 01 PHP
php生成二维码
Aug 10 PHP
PHP会话处理的10个函数
Aug 11 PHP
PHP生成随机密码方法汇总
Aug 27 PHP
php实现中文转数字
Feb 18 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
Jan 24 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
php+redis消息队列实现抢购功能
Feb 08 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用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
Ajax 数据请求的简单分析
2011/04/05 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
Javascript实现运算符重载详解
2018/04/07 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
Javascript的this详解
2019/03/23 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python科学计算之Pandas详解
2017/01/15 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
python使用knn实现特征向量分类
2018/12/26 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
Python数据可视化:箱线图多种库画法
2019/11/06 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
简述数据库的设计过程
2015/06/22 面试题
幼儿园三八妇女节活动方案
2014/03/11 职场文书
我的收音机情缘
2022/04/05 无线电
MySQL数据库 任意ip连接方法
2022/05/20 MySQL