PHPackages                             lukaszmakuch/table-renderer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. lukaszmakuch/table-renderer

ActiveLibrary

lukaszmakuch/table-renderer
===========================

Allows to render tree structures as tables (e.g. HTML).

v0.5(10y ago)223MITPHP

Since Mar 13Pushed 10y ago3 watchersCompare

[ Source](https://github.com/lukaszmakuch/table-renderer)[ Packagist](https://packagist.org/packages/lukaszmakuch/table-renderer)[ RSS](/packages/lukaszmakuch-table-renderer/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (6)Versions (6)Used By (0)

[![travis](https://camo.githubusercontent.com/aeeb2e7b8c5444ab6ce89947181f88cbeae7031cc1eea656a117bbf3aa676f7b/68747470733a2f2f7472617669732d63692e6f72672f6c756b61737a6d616b7563682f7461626c652d72656e64657265722e737667)](https://travis-ci.org/lukaszmakuch/table-renderer)

Table renderer
==============

[](#table-renderer)

Allows to render tree structures as tables.

HTML example
------------

[](#html-example)

[![alt text](https://camo.githubusercontent.com/d0d7571de5ea0d511c9567cbcbe4a9ddfd89a0261d6439f5454b07ad1bb466bd/687474703a2f2f6c756b61737a6d616b7563682e706c2f6d6973632f7461626c655f72656e64657265725f6f6e655f737465702e6a7067 "Tree structure compared to an HTML structure")](http://lukaszmakuch.pl/misc/table_renderer.jpg)Click the image for more examples.

Trees
-----

[](#trees)

### Elements

[](#elements)

There are 3 main elements of every tree:

#### Atomic values

[](#atomic-values)

They are indivisible.

##### TextValue

[](#textvalue)

It simply holds some text which will be rendered inside some cell.

```
use lukaszmakuch\TableRenderer\TextValue;

$flowers = new TextValue("roses");
```

#### Containers

[](#containers)

They hold other elements.

##### HorizontalContainer

[](#horizontalcontainer)

Its elements are on top of each other.

```
use lukaszmakuch\TableRenderer\HorizontalContainer;
use lukaszmakuch\TableRenderer\TextValue;

$column = (new HorizontalContainer())
    ->add(new TextValue("top"))
    ->add(new TextValue("bottom"));
```

##### HorizontalContainer

[](#horizontalcontainer-1)

Its elements are next to each other.

```
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;

$row = (new VerticalContainer())
    ->add(new TextValue("left"))
    ->add(new TextValue("right"));
```

### Building trees

[](#building-trees)

It's possible to build a composite of any complexity.

```
use lukaszmakuch\TableRenderer\HorizontalContainer;
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;

$table = (new HorizontalContainer())
    ->add((new VerticalContainer())
        ->add(new TextValue("top left"))
        ->add(new TextValue("top middle"))
        ->add(new TextValue("top right"))
    )
    ->add((new VerticalContainer())
        ->add(new TextValue("bottom left"))
        ->add(new TextValue("bottom right"))
    );
```

Renderers
---------

[](#renderers)

Allows to render tables based on tree structures.

### HTMLRenderer

[](#htmlrenderer)

Renders HTML code.

#### Getting the renderer

[](#getting-the-renderer)

```
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;

$builder = new HTMLRendererBuilder();
$htmlRenderer = $builder->buildRenderer();
```

#### Basic usage

[](#basic-usage)

```
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRenderer;

$tree = (new VerticalContainer())
    ->add(new TextValue("left"))
    ->add(new TextValue("right"));

/* @var $renderer HTMLRenderer */
echo $renderer->renderHTMLBasedOn($tree);
```

#### Adding HTML attributes

[](#adding-html-attributes)

It's possible to assign HTML attributes to atomic values as well as to a whole table. [ObjectAttributeContainer](https://github.com/lukaszmakuch/object-attribute-container) is used to achieve that.

##### Building renderer with support of additional attributes

[](#building-renderer-with-support-of-additional-attributes)

First, you need to build the renderer with some attribute container.

```
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;
use lukaszmakuch\ObjectAttributeContainer\Impl\ObjectAttributeContainerImpl;

//source of attributes
$attrs = new ObjectAttributeContainerImpl();

//building with the attribute container
$builder = new HTMLRendererBuilder();
$builder->setAttributeContainer($attrs);

$htmlRenderer = $builder->buildRenderer();
```

##### Adding attributes to a tree.

[](#adding-attributes-to-a-tree)

```
use lukaszmakuch\ObjectAttributeContainer\ObjectAttributeContainer;
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRenderer;

/* @var $attrs ObjectAttributeContainer */

//table with border 1
$tree = $attrs->addObjAttrs(

    (new VerticalContainer())

        //cell with no extra style
        ->add(new TextValue("left"))

        //cell with red text
        ->add($attrs->addObjAttrs(
            new TextValue("right"),
            ["attrs" => ["style" => "color: #f00"]]
        )),

    ["attrs" => ["border" => 1]]
);

/* @var $renderer HTMLRenderer */
echo $renderer->renderHTMLBasedOn($tree);
```

#### Support of custom atomic values

[](#support-of-custom-atomic-values)

This renderer supports custom atomic values. A custom value should extend [AtomicCellValue](src/AtomicCellValue.php) and be supported by an instance of [AtomicValueRenderer](src/HTMLRenderer/AtomicValueRenderer/AtomicValueRenderer.php). Then you can register a new atomic value renderer like that:

```
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;

/* @var @builder HTMLRendererBuilder */
$builder->addAtomicValueRenderer(
    NewAtomicType::class,
    new NewAtomicTypeRenderer()
);
```

### ScalarRenderer

[](#scalarrenderer)

It renders models of tables as scalar values or arrays of scalar values (or other arrays).

#### Getting the renderer

[](#getting-the-renderer-1)

```
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRendererBuilder;

$renderer = (new ScalarRendererBuilder())->build();
```

#### Basic usage

[](#basic-usage-1)

```
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRenderer;

$tree = (new VerticalContainer())
    ->add(new TextValue("first"))
    ->add(new TextValue("second"));

/* @var $renderer ScalarRenderer */
var_dump($renderer->getScalarRepresentationOf($tree));
//[
//    'type' => 'vertical-container',
//    'value' => [
//        ['type' => 'text', 'value' => 'first'],
//        ['type' => 'text', 'value' => 'second']
//     ]
//]
```

#### Support of custom elements

[](#support-of-custom-elements)

This renderer supports custom elements. A custom element should extend [AtomicCellValue](src/AtomicCellValue.php) and be supported by an instance of [ScalarRenderer](src/ScalarRenderer/ScalarRenderer.php). Then you can register a new element renderer like that:

```
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRendererBuilder;

/* @var @builder ScalarRendererBuilder */
$builder->addRenderer(
    NewAtomicType::class,
    new NewAtomicTypeRenderer()
);
```

Examples
--------

[](#examples)

Check examples in the [examples directory](examples/)

Installation
------------

[](#installation)

Use [composer](https://getcomposer.org) to get the latest version:

```
$ composer require lukaszmakuch/table-renderer

```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community5

Small or concentrated contributor base

Maturity57

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~10 days

Total

5

Last Release

3667d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5e08a5c26bd9824a0345f417660e2d1146f044c886266daf2dd0901720fbcf32?d=identicon)[lukaszmakuch](/maintainers/lukaszmakuch)

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/lukaszmakuch-table-renderer/health.svg)

```
[![Health](https://phpackages.com/badges/lukaszmakuch-table-renderer/health.svg)](https://phpackages.com/packages/lukaszmakuch-table-renderer)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
