分类 PHP 下的文章

在PHP中处理树形结构,特别是从一个数组转换为树形结构(arrayToTree)以及将树形结构转换回数组(treeToArray),是实现复杂数据处理和展示的常见需求。此外,获取树的最大深度也是一个有用的功能。下面我将详细介绍如何实现这些功能。

构建树形结构(arrayToTree

首先,我们从一个简单的数组构建一个树形结构。假设我们有一个数组,其中每个元素都有一个parent_id字段指向其父节点。

$items = [
    ['id' => 1, 'name' => 'Root', 'parent_id' => 0],
    ['id' => 2, 'name' => 'Child 1', 'parent_id' => 1],
    ['id' => 3, 'name' => 'Child 2', 'parent_id' => 1],
    ['id' => 4, 'name' => 'Child 3', 'parent_id' => 2],
    ['id' => 5, 'name' => 'Child 4', 'parent_id' => 2]
];

我们可以使用以下函数将这个数组转换为树形结构:

function arrayToTree($items, $parentId = 0) {
    $branch = [];
    foreach ($items as $item) {
        if ($item['parent_id'] == $parentId) {
            $children = arrayToTree($items, $item['id']);
            if ($children) {
                $item['children'] = $children;
            }
            $branch[] = $item;
        }
    }
    return $branch;
}
 
$tree = arrayToTree($items);
print_r($tree);

将树形结构转换回数组(treeToArray

将树形结构转换回数组通常是为了便于存储或进一步处理。我们可以使用递归函数来实现这一点:

function treeToArray($tree) {
    $result = [];
    foreach ($tree as $node) {
        $result[] = $node;
        if (!empty($node['children'])) {
            foreach (treeToArray($node['children']) as $child) {
                $result[] = $child;
            }
        }
    }
    return $result;
}
 
$array = treeToArray($tree);
print_r($array);

获取树的最大深度

要获取树的最大深度,我们可以使用递归函数来遍历每个节点并记录最大深度:

function getMaxDepth($tree) {
    $depths = [];
    foreach ($tree as $node) {
        $depths[] = getNodeDepth($node);
    }
    return max($depths);
}
 
function getNodeDepth($node, $depth = 0) {
    if (empty($node['children'])) {
        return $depth; // Base case: leaf node reached.
    } else {
        $maxChildDepth = 0; // Initialize max depth for children.
        foreach ($node['children'] as $child) {
            $maxChildDepth = max($maxChildDepth, getNodeDepth($child, $depth + 1)); // Recursive call.
        }
        return $maxChildDepth; // Return the maximum depth found in children.
    }
}
 
$maxDepth = getMaxDepth($tree);
echo "Max Depth: " . $maxDepth; // Output the maximum depth.

/**
* 判断字符串是否为 Json 格式
*
* @param string $data Json 字符串
* @param bool $assoc 是否返回关联数组。默认返回对象
*
* @return array|bool|object 成功返回转换后的对象或数组,失败返回 false
*/
function isJson($data = '', $assoc = false) {
  $data = json_decode($data, $assoc);
  if (($data && is_object($data)) || (is_array($data) && !empty($data))) {
    return $data;
  }
  return false;
}

如果是MySQL数据库,可进入主机的数据库管理后台,找到博客数据库中的typecho_users表,修改password的值为e10adc3949ba59abbe56e057f20f883e(相当于加密过的密码123456)。

如果使用Sqlite数据库,则先将数据库下载到本地,用数据库管理工具(如Navicat)按上述步骤修改,修改后再上传回虚拟主机。

完成后,用密码123456登录,进入到后台修改密码。

<?php Typecho_Widget::widget('Widget_Stat')->to($stat); ?>
文章总数:<?php $stat->publishedPostsNum() ?>篇
分类总数:<?php $stat->categoriesNum() ?>个
评论总数:<?php $stat->publishedCommentsNum() ?>条
页面总数:<?php $stat->publishedPagesNum() ?>个
当前作者的文章总数:<?php $stat->myPublishedPostsNum() ?>篇

- 阅读剩余部分 -

全局唯一标识 UUID (Universally unique identifier)

格式

格式为:00000000-0000-0000-0000-000000000000
总长度 36,由 32 个 16 进制字符和 4 个连字符组成。连字符仅用于增加可读性,实际的精度为一个 16 进制字符为 2^4=4bit,32 个则为 32*4bit=128bit

- 阅读剩余部分 -