Search by

byjg / anydataset

byjg

AnyDataset is a powerful data source abstraction layer for PHP that provides a simple and consistent interface to access different data sources. With AnyDataset, you can work with various data formats and storage systems using the same programming interface.

Package info

github.com/byjg/php-anydataset

pkg:composer/byjg/anydataset

Statistics

Installs: 157 823

Dependents: 8

Suggesters: 0

Stars: 12

Open Issues: 0

6.0.0 2025-11-25 03:57 UTC

README

sidebar_key anydataset
sidebar_category data-access
tags
php anydataset databases

AnyDataset

Read any data source with the same code: a database, JSON, XML, a CSV or fixed-width file, a NoSQL store. Every one of them gives you the same iterator of rows.

Sponsor Build Status Opensource ByJG Install MCP Server GitHub source GitHub license GitHub release

It is the core component of the Anydataset project, an agnostic data source abstraction layer for PHP.

Why

Each kind of data has its own API: a PDO statement, json_decode() arrays, SimpleXML, an fgetcsv() loop, a MongoDB cursor. Code written for one cannot read another, and each needs its own loop, filter and conversion.

AnyDataset gives every source the same result: an iterator of Row objects.

$iterator = $executor->getIterator('select * from users');           // database (anydataset-db)
$iterator = (new JsonDataset($json))->getIterator('/users');         // JSON (anydataset-json)
$iterator = TextFileDataset::getInstance('users.csv')
    ->withFieldParser(TextFileDataset::CSVFILE)
    ->getIterator();                                                 // CSV (anydataset-text)

foreach ($iterator as $row) {
    echo $row->get('name');
}
  • Change the source, keep the code. The loop, toArray(), toEntities(), first() and exists() are the same whatever produced the iterator.
  • One filter, in memory or in SQL. An IteratorFilter filters an in-memory AnyDataset, and the same filter becomes the WHERE clause of a database query.
  • Combine sources. import() any iterator into an AnyDataset to sort, filter or save it.

Key Features

  • Unified Interface: Access different data sources (databases, arrays, XML, JSON, etc.) using the same interface
  • Flexible Iteration: Multiple ways to iterate through your data
  • Powerful Filtering: Filter your data using a SQL-like syntax
  • Data Transformation: Convert between different formats (JSON, XML, arrays)
  • Validation: Validate your data against rules
  • Extensible: Create your own data source implementations

Installation

composer require "byjg/anydataset"

Quick Start

<?php
# Create a dataset
$dataset = new \ByJG\AnyDataset\Core\AnyDataset("example");

# Get an iterator
$iterator = $dataset->getIterator();

# Iterate over the results
foreach ($iterator as $row) {
    print_r($row->toArray());
}

Documentation

Core Concepts

Advanced Features

Available Implementations

Data Source Type Implementation Read/Write Repository
Core AnyDataSet R/W Github
Databases DbDriverInterface R/W Github
Arrays ArrayDataSet R Github
Text Files TextFileDataSet R Github
Fixed Width Files FixedTextFileDataSet R Github
XML XmlDataSet R Github
JSON JSONDataSet R Github
SparQL SparQLDataSet R Github
NoSQL Document NoSqlDocumentInterface R/W Github
NoSQL Key/Value KeyValueInterface R/W Github

Example Code Snippets

Filtering Data

<?php
$filter = new \ByJG\AnyDataset\Core\IteratorFilter();
$filter->and("field1", \ByJG\AnyDataset\Core\Enum\Relation::Equal, 10);
$iterator = $dataset->getIterator($filter);

Using Formatters

<?php
use ByJG\AnyDataset\Core\Formatter\JsonFormatter;
use ByJG\AnyDataset\Core\Formatter\XmlFormatter;

$formatter = new XmlFormatter($anydataset->getIterator());
$formatter->raw();                           // Return a DOM object
$formatter->toText();                        // Return the XML as a text
$formatter->saveToFile("/path/to/file.xml"); // Save the XML Text to a file

// JsonFormatter has the same API; raw() returns the json_decode()d value
$json = (new JsonFormatter($anydataset->getIterator()))->toText();

Both formatters accept a GenericIterator or a single RowInterface.

Running Tests

vendor/bin/phpunit

Open source ByJG