123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?php
- namespace utils;
- class Tree
- {
- public function createTreeByList($data, $pid = 0, $lv = 1, $idField = 'id', $pidField = 'pid', $child = 'tcd')
- {
- $tree = [];
- foreach ($data as $k => $v) {
- if ($v[$pidField] == $pid) {
- $v['tlv'] = $lv;
- $v[$child] = [];
- $tcd = $this->createTreeByList($data, $v[$idField], $lv + 1, $idField, $pidField, $child);
- if (!empty($tcd)) {
- $v[$child] = $tcd;
- }
- $tree[] = $v;
- }
- }
- return $tree;
- }
- public function treeToList($tree, $ignore_tlv = 0)
- {
- $list = [];
- foreach ($tree as $k => $v) {
- if ($ignore_tlv == $v['tlv']) {
- $list[] = $v;
- continue;
- }
- $tcd = empty($v['tcd']) ? [] : $this->treeToList($v['tcd'], $ignore_tlv);
- if (isset($v['tcd'])) {
- unset($v['tcd']);
- }
- $list[] = $v;
- foreach ($tcd as $child) {
- $list[] = $child;
- }
- }
- return $list;
- }
- public function createListByTree($tree, $name = 'name', $ignore_pid = -1, $prefix = '')
- {
- $list = [];
- $count = count($tree);
- foreach ($tree as $k => $v) {
- //名称前缀
- if ($ignore_pid != $v['pid']) {
- if ($k < $count - 1) {
- $v[$name] = $prefix . ' ├ ' . $v[$name];
- $tcd = empty($v['tcd']) ? [] : $this->createListByTree($v['tcd'], $name, $ignore_pid, $prefix . ' │ ');
- } else {
- $v[$name] = $prefix . ' ┕ ' . $v[$name];
- $tcd = empty($v['tcd']) ? [] : $this->createListByTree($v['tcd'], $name, $ignore_pid, $prefix . ' ');
- }
- } else {
- $v[$name] = $prefix . $v[$name];
- $tcd = empty($v['tcd']) ? [] : $this->createListByTree($v['tcd'], $name, $ignore_pid, $prefix);
- }
- if (isset($v['tcd'])) {
- unset($v['tcd']);
- }
- $v['tcd'] = count($tcd);
- $list[] = $v;
- foreach ($tcd as $child) {
- $list[] = $child;
- }
- }
- return $list;
- }
- //将数组保存文件
- public function saveArrayToFile($file, $array, $topNote = '')
- {
- $str = $this->arrayToString($array);
- $this->folders(dirname($file));
- if ($topNote) {
- $topNote = "/*" . $topNote . "*/\n\n";
- }
- return file_put_contents($file, "<?php \n" . $topNote . "return " . $str . ";");
- }
- private function arrayToString($array, $ref = '')
- {
- if (empty($array)) {
- return '[]';
- }
- $nowrap = true;
- $count = count($array);
- if ($count <= 8) {
- foreach ($array as $k => $v) {
- if (empty($v)) {
- continue;
- }
- if (!is_scalar($v)) {
- $nowrap = false;
- break;
- }
- if (is_string($k) && mb_strlen($k, 'utf-8') > 20) {
- $nowrap = false;
- break;
- }
- if (is_string($v) && mb_strlen($v, 'utf-8') > 60) {
- $nowrap = false;
- break;
- }
- }
- } else {
- $nowrap = false;
- }
- $str = $nowrap ? "[" : "[\n";
- $newref = $nowrap ? '' : $ref . ' ';
- $i = 0;
- foreach ($array as $k => $v) {
- //key
- if (is_string($k)) {
- $str .= "$newref'$k' => ";
- } else {
- $str .= "{$newref}{$k} => ";
- }
- //value
- if (is_array($v)) {
- $str .= self::arrayToString($v, $ref . ' ');
- } elseif (is_int($v) || is_float($v)) {
- $str .= $v;
- } elseif (is_string($v)) {
- $str .= "'$v'";
- } elseif (is_bool($v)) {
- $str .= ($v ? 'true' : 'false');
- } else {
- //对象略
- $str .= "''";
- }
- if ($i == $count - 1) {
- $str .= $nowrap ? "" : "\n";
- } else {
- $str .= $nowrap ? ", " : ",\n";
- }
- $i++;
- }
- $str .= $nowrap ? "]" : $ref . "]";
- return $str;
- }
- /**
- * 创建文件夹
- * @param $dir
- * @return bool
- */
- public function folders($dir)
- {
- return is_dir($dir) || ($this->folders(dirname($dir)) && mkdir($dir));
- }
- }
|