im/extend/utils/Tree.php

173 lines
4.7 KiB
PHP
Raw Permalink Normal View History

2023-09-26 18:09:46 +08:00
<?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));
}
}