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)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。