Skip to main content

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 TypeImplementationRead/WriteRepository
CoreAnyDataSetR/WGithub
DatabasesDbDriverInterfaceR/WGithub
ArraysArrayDataSetRGithub
Text FilesTextFileDataSetRGithub
Fixed Width FilesFixedTextFileDataSetRGithub
XMLXmlDataSetRGithub
JSONJSONDataSetRGithub
SparQLSparQLDataSetRGithub
NoSQL DocumentNoSqlDocumentInterfaceR/WGithub
NoSQL Key/ValueKeyValueInterfaceR/WGithub

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