{"id":21874547,"url":"https://github.com/smoren/graph-tools-php","last_synced_at":"2026-03-17T21:04:57.387Z","repository":{"id":58210242,"uuid":"527700408","full_name":"Smoren/graph-tools-php","owner":"Smoren","description":"Tools for building and traversing directed graphs","archived":false,"fork":false,"pushed_at":"2024-12-18T21:51:05.000Z","size":156,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-28T13:21:16.094Z","etag":null,"topics":["edge","graph","graph-algorithms","php","traverse","vertex"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Smoren.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-08-22T19:13:39.000Z","updated_at":"2024-12-18T21:51:09.000Z","dependencies_parsed_at":"2024-12-18T22:23:28.928Z","dependency_job_id":"82d76d8c-cac9-47ec-900a-7214f7467fa5","html_url":"https://github.com/Smoren/graph-tools-php","commit_stats":{"total_commits":85,"total_committers":2,"mean_commits":42.5,"dds":0.0117647058823529,"last_synced_commit":"3d0d7ca394e0fb9f6456be065873571748ba3b81"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fgraph-tools-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fgraph-tools-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fgraph-tools-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fgraph-tools-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Smoren","download_url":"https://codeload.github.com/Smoren/graph-tools-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248986873,"owners_count":21194136,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["edge","graph","graph-algorithms","php","traverse","vertex"],"created_at":"2024-11-28T07:12:40.869Z","updated_at":"2026-03-17T21:04:57.355Z","avatar_url":"https://github.com/Smoren.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# graph-tools\n\n![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/smoren/graph-tools)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Smoren/graph-tools-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Smoren/graph-tools-php/?branch=master)\n[![Coverage Status](https://coveralls.io/repos/github/Smoren/graph-tools-php/badge.svg?branch=master)](https://coveralls.io/github/Smoren/graph-tools-php?branch=master)\n![Build and test](https://github.com/Smoren/graph-tools-php/actions/workflows/test_master.yml/badge.svg)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nTools for working with graphs\n\n### How to install to your project\n```\ncomposer require smoren/graph-tools\n```\n\n### Unit testing\n```\ncomposer install\ncomposer test-init\ncomposer test\n```\n\n### Usage\n\n#### Working with preloaded graph repository\n\n##### Basic graph\n\n```php\nuse Smoren\\GraphTools\\Models\\Edge;\nuse Smoren\\GraphTools\\Models\\Vertex;\nuse Smoren\\GraphTools\\Traverse\\Traverse;\nuse Smoren\\GraphTools\\Traverse\\TraverseDirect;\nuse Smoren\\GraphTools\\Traverse\\TraverseReverse;\nuse Smoren\\GraphTools\\Filters\\TransparentTraverseFilter;\nuse Smoren\\GraphTools\\Store\\PreloadedGraphRepository;\nuse Smoren\\GraphTools\\Structs\\FilterConfig;\n\n$vertexes = [\n    new Vertex(1, 1, null), // id, type, extra data\n    new Vertex(2, 1, null),\n    new Vertex(3, 1, null),\n];\n$connections = [\n    new Edge(1, 1, 1, 2), // id, type, from id, to id\n    new Edge(2, 1, 2, 3),\n];\n\n// Creating repository\n$repo = new PreloadedGraphRepository($vertexes, $connections);\n\n// Creating direct traverse model\n$traverse = new TraverseDirect($repo);\n$contexts = $traverse-\u003egenerate(\n    $repo-\u003egetVertexById(1),\n    new TransparentTraverseFilter([FilterConfig::PREVENT_LOOP_PASS])\n);\n\n// Let's go traverse\n$vertexIds = [];\nforeach($contexts as $context) {\n    $vertexIds[] = $context-\u003egetVertex()-\u003egetId();\n}\nprint_r($vertexIds); // [1, 2, 3]\n\n// Creating reverse traverse model\n$traverse = new TraverseReverse($repo);\n$contexts = $traverse-\u003egenerate(\n    $repo-\u003egetVertexById(3),\n    new TransparentTraverseFilter([FilterConfig::PREVENT_LOOP_PASS])\n);\n\n// Let's go traverse\n$vertexIds = [];\nforeach($contexts as $context) {\n    $vertexIds[] = $context-\u003egetVertex()-\u003egetId();\n}\nprint_r($vertexIds); // [3, 2, 1]\n\n$traverse = new Traverse($repo);\n\n// Creating non-directed traverse model\n$contexts = $traverse-\u003egenerate(\n    $repo-\u003egetVertexById(2),\n    new TransparentTraverseFilter([FilterConfig::PREVENT_LOOP_PASS])\n);\n\n// Let's go traverse\n$vertexIds = [];\n$loopsCount = 0;\nforeach($contexts as $context) {\n    if($context-\u003eisLoop()) {\n        $contexts-\u003esend(Traverse::STOP_BRANCH);\n        ++$loopsCount;\n    } else {\n        $vertexIds[] = $context-\u003egetVertex()-\u003egetId();\n    }\n}\nprint_r($vertexIds); // [2, 3, 1]\nvar_dump($loopsCount); // 2\n\n// Creating non-directed traverse model with loop prevent control\n$contexts = $traverse-\u003egenerate(\n    $repo-\u003egetVertexById(2),\n    new TransparentTraverseFilter([FilterConfig::PREVENT_LOOP_PASS, FilterConfig::PREVENT_LOOP_HANDLE])\n);\n\n// Let's go traverse\n$vertexIds = [];\nforeach($contexts as $context) {\n    $vertexIds[] = $context-\u003egetVertex()-\u003egetId();\n}\nprint_r($vertexIds); // [2, 3, 1]\n```\n\nLook for more examples in [tests](https://github.com/Smoren/graph-tools-php/tree/master/tests/unit).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmoren%2Fgraph-tools-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmoren%2Fgraph-tools-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmoren%2Fgraph-tools-php/lists"}