logo

Створення хелпера в PHP

У розробці веб-додатків з використанням PHP, часто виникає потреба в організації та обробці деревовидних структур даних. Ці структури можуть використовуватись для відображення категорій товарів, меню, коментарів та інших ієрархічних даних. У цій статті ми розглянемо, як створити “Helper array tree” для роботи з деревами в PHP.

Що таке Helper array tree?

Helper array tree — це допоміжний клас або набір функцій, які полегшують роботу з деревовидними структурами даних у масивах. Основні завдання, які він виконує:

Перетворення лінійних масивів у деревовидні структури.
Додавання, видалення та переміщення вузлів у дереві.
Обхід дерева та виконання різних операцій над вузлами.

Приклад реалізації

Для початку створимо простий клас TreeHelper, який буде містити методи для роботи з деревовидними структурами даних.

<?php

class TreeHelper { // Метод для перетворення лінійного масиву у дерево public static function buildTree(array $elements, $parentId = 0) { $branch = [];

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = self::buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

// Метод для обходу дерева та виконання операції над кожним вузлом
public static function traverseTree(array $tree, callable $callback) {
    foreach ($tree as $node) {
        $callback($node);
        if (isset($node['children'])) {
            self::traverseTree($node['children'], $callback);
        }
    }
}

// Метод для додавання нового вузла у дерево
public static function addNode(array &amp;$tree, $parentId, array $newNode) {
    foreach ($tree as &amp;$node) {
        if ($node['id'] == $parentId) {
            $node['children'][] = $newNode;
            return true;
        }
        if (isset($node['children'])) {
            if (self::addNode($node['children'], $parentId, $newNode)) {
                return true;
            }
        }
    }
    return false;
}

// Метод для видалення вузла з дерева
public static function removeNode(array &amp;$tree, $nodeId) {
    foreach ($tree as $key =&gt; &amp;$node) {
        if ($node['id'] == $nodeId) {
            unset($tree[$key]);
            return true;
        }
        if (isset($node['children'])) {
            if (self::removeNode($node['children'], $nodeId)) {
                return true;
            }
        }
    }
    return false;
}

} ?>