Created
March 1, 2017 05:03
-
-
Save take-piro/896bfed33d334d38281ef39f4acc241b to your computer and use it in GitHub Desktop.
お手製 var_dump()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* これを作った意図は,CLIとかでvar_dump()をすると とにかく見づらかった から(改行多すぎ) | |
* 自分なりに比較的見やすいものを書いてみた. | |
* | |
* 文字列が半角英数ならoutputもきれいなのだが,全角文字が入るとガタガタになっちゃう... | |
*/ | |
/** | |
* オブジェクト(クラス,配列)の中身を(ある程度)成形して出力する(お手製var_dump()) | |
* | |
* @param object $obj オブジェクト(クラス,配列) | |
* @return void (キーと要素が出力される) | |
*/ | |
function my_dump( $obj ) | |
{ | |
static $stage = 0; | |
$base = gettype($obj); | |
echo "({$base}) { "; | |
if ($base != 'array' && $base != 'object') { | |
echo "{$obj} }\n"; | |
}else{ | |
echo "\n"; | |
// キー,要素それぞれの最長バイト数を取得 | |
$lenght_key = 0; | |
$lenght_val = 0; | |
foreach ($obj as $key => $value) { | |
if ($lenght_key < strlen($key)) { | |
$lenght_key = strlen($key); | |
} | |
$len_tmp = 0; | |
switch (gettype($value)) { | |
case 'array': | |
$len_tmp = strlen('Array'); | |
break; | |
case 'object': | |
$len_tmp = strlen('Object'); | |
break; | |
case 'resource': | |
$len_tmp = strlen('Resource'); | |
break; | |
case 'unknown type': | |
$len_tmp = strlen('Unknown Type'); | |
break; | |
case 'string': | |
$len_tmp = mb_strlen($value); | |
break; | |
default: | |
$len_tmp = strlen($value); | |
break; | |
} | |
if ($lenght_val < $len_tmp) { | |
$lenght_val = $len_tmp; | |
} | |
} | |
foreach ($obj as $key => $value) { | |
if ($stage >= 1) { | |
for ($i=0; $i < $stage; $i++) { | |
echo '*'; | |
} | |
echo ' '; | |
} | |
echo str_pad($key, $lenght_key, ' ', STR_PAD_LEFT).' => '; | |
switch (gettype($value)) { | |
case 'array': | |
$stage++; | |
_dump($value); | |
$stage--; | |
break; | |
case 'object': | |
$stage++; | |
_dump($value); | |
$stage--; | |
break; | |
case 'resource': | |
echo str_pad('Resource', $lenght_val, ' ', STR_PAD_LEFT); | |
echo "\n"; | |
break; | |
case 'unknown type': | |
echo str_pad('Unknown Type', $lenght_val, ' ', STR_PAD_LEFT); | |
echo "\n"; | |
break; | |
case 'string': | |
if ($lenght_val === mb_strlen($value)) { | |
$len = 0; | |
}else{ | |
$len = $lenght_val; | |
} | |
echo mb_str_pad($value, $len, ' ', STR_PAD_RIGHT, 'utf8').' (string)'; | |
echo "\n"; | |
break; | |
default: | |
$str = (is_null($value)) ? 'NULL' : $value; | |
echo str_pad($str, $lenght_val, ' ', STR_PAD_RIGHT).' ('.gettype($value).')'; | |
echo "\n"; | |
break; | |
} | |
} | |
if ($stage >= 1) { | |
for ($i=0; $i < $stage; $i++) { | |
echo '*'; | |
} | |
echo ' '; | |
} | |
echo "}\n"; | |
} | |
} | |
/** | |
* 2byte文字対応版 str_pad | |
* テキストの長さに合わせて空白で埋めてくれる関数 | |
* _dump 内で主に使用 | |
* | |
* @param string $str 対象の文字列 | |
* @param integer $pad_len 何byte分埋めるか 合わせる文字長 | |
* @param string $pad_str 埋める文字 default ' ' | |
* @param integer $dir 対象の文字列に対してどこを埋めるか default STR_PAD_RIGHT | |
* STR_PAD_RIGHT: 文字列の末尾に追加, STR_PAD_LEFT: 文字列の先頭に追加, STR_PAD_BOTH: 両端に追加 | |
* @param string $encoding エンコーディングする型 default NULL(utf8) | |
* @return string 成形された文字列 | |
*/ | |
function mb_str_pad($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT, $encoding = NULL) | |
{ | |
$encoding = $encoding === NULL ? mb_internal_encoding() : $encoding; | |
$padBefore = $dir === STR_PAD_BOTH || $dir === STR_PAD_LEFT; | |
$padAfter = $dir === STR_PAD_BOTH || $dir === STR_PAD_RIGHT; | |
$pad_len -= mb_strlen($str, $encoding); | |
$targetLen = $padBefore && $padAfter ? $pad_len / 2 : $pad_len; | |
$strToRepeatLen = mb_strlen($pad_str, $encoding); | |
$repeatTimes = ceil($targetLen / $strToRepeatLen); | |
$repeatedString = str_repeat($pad_str, max(0, $repeatTimes)); // safe if used with valid utf-8 strings | |
$before = $padBefore ? mb_substr($repeatedString, 0, floor($targetLen), $encoding) : ''; | |
$after = $padAfter ? mb_substr($repeatedString, 0, ceil($targetLen), $encoding) : ''; | |
return $before . $str . $after; | |
} | |
// sample | |
$obj = new stdClass(); | |
$obj->var1 = 'foo'; | |
$obj->var2 = 1234; | |
$obj2 = new stdClass(); | |
$obj2->var1 = $obj; | |
$obj2->var2 = 'bazz'; | |
$ary = [ | |
'key1' => 'bar', | |
'key2' => 5678, | |
'key3' => $obj2, | |
'key4' => 'fizz', | |
]; | |
my_dump($ary); | |
/** | |
* output: | |
* (array) { | |
* key1 => bar (string) | |
* key2 => 5678 (integer) | |
* key3 => (object) { | |
* * var1 => (object) { | |
* ** var1 => foo (string) | |
* ** var2 => 1234 (integer) | |
* ** } | |
* * var2 => bazz (string) | |
* * } | |
* key4 => fizz (string) | |
* } | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment