php 控制台打印二维数组

使用

use console\models\PrintTable;

$arr=[
    ['a'=>'aaaa','b'=>'bbbb','c'=>'cbbbb','d'=>'dbbb','e'=>'ebbb','f'=>'fbbb','g'=>'gbbb'],
    ['a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g'],
    ['a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g'],
    ['a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g'],
    ['a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g'],
    ['a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g'],
];
echo PrintTable::Print_table($arr);

效果

效果

实现

namespace console\models;

/**
 * 控制台输入二维数组
 * Class PrintTable
 * @package common\models\tool
 */
class PrintTable{

    /**
     * 计算中文个数
     * @param string $str
     * @return mixed
     */
    private static function getStrLen(string $str){
      return  (strlen($str)- mb_strlen($str))/2;
    }

    /**
     * 计算字符串的字节数
     * @param $str
     * @return bool|false|int|mixed
     */
    private static function getStrByteNumber($str){
       return  mb_strlen($str) + self::getStrLen($str);
    }

    /**
     * 计算数组的最大长度
     * @param $arr
     * @return array
     */
    private static function columnMaxStrLen($arr){
        $keys = array_keys($arr[0]);
        //计算数组的key的长度
        $number_arr=[];
        foreach ($keys as $key){
            $number_arr[] = self::getStrByteNumber($key);
        }
        //计算数组的值长度
        $i=0;
        foreach ($keys as $key){
            $column = array_column($arr ,$key);
            foreach ( $column as $value){
                $str = (string) $value;
                //字符串字节数
                $strNumber =self::getStrByteNumber($str);
                if($number_arr[$i] < $strNumber ){
                    $number_arr[$i] =   $strNumber;
                }
            }
            $i++;
        }
        return $number_arr;
    }

    /**
     * 将一个字符拼接多次
     * @param $int
     * @param string $str
     * @return string
     */
    private static function dump_number($int ,$str ='-'){
        $res ='';
        for ($i=1;$i<=$int;$i++){
            $res .=$str;
        }
        return $res;
    }

    /**
     * 构造分割线
     * @param $maxLens
     * @return string
     */
    private static function intervalStr($maxLens){
        $str ='';
        foreach ($maxLens as $value){
            $str .="+".self::dump_number($value+2 ,'-');
        }
        return $str."-+";
    }

    /**
     * 拼接二维数组的一行
     * @param $maxLens
     * @param $row
     * @return string
     */
    private static function Print_row($maxLens,$row){
        $str ='';
        $i=0;
        foreach ($row as $value){
            $field =  (string) $value;
            $str .="| ". $field;
            //拼接空格
            $str .= self::dump_number($maxLens[$i] +1 - self::getStrByteNumber($field)," ") ;
            $i++;
        }
        return $str." |";
    }

    /**
     * 打印数组
     * @param $arr
     * @param string $str
     * @return string
     */
    public static function Print_table($arr,$str = "\n"){
        //每一列的字符最大字符串长度
        $maxLens = self::columnMaxStrLen($arr);
        //分割线
        $intervalStr = self::intervalStr($maxLens);
        //打印字段
        $fieldStr = self::Print_row($maxLens,array_keys($arr[0]));
        $res = $intervalStr.$str;
        $res .=$fieldStr;
        foreach ($arr as $item){
            $res .= $str.$intervalStr.$str.self::Print_row($maxLens,$item);
        }
        return  $res.$str.$intervalStr.$str;
    }
}
This entry was posted in php. Bookmark the permalink.

发表回复