PHP print_r方法可以把变量打印显示,使变量易于理解。如果变量是string,integer或float,将打印变量值本身,如果变量是array,将会按照一定格式显示键和元素。object与数组类似。print_r用于打印数组较多。
php原生没有把print_r方法打印后的数据还原为原始数组,因此写了下面这个方法,实现将print_r处理后的数据还原为原始数组。
RestorePrint.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。