Skip to content

Instantly share code, notes, and snippets.

@take-piro
Created March 1, 2017 05:03
Show Gist options
  • Save take-piro/896bfed33d334d38281ef39f4acc241b to your computer and use it in GitHub Desktop.
Save take-piro/896bfed33d334d38281ef39f4acc241b to your computer and use it in GitHub Desktop.
お手製 var_dump()
<?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