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.
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()andexists()are the same whatever produced the iterator. - One filter, in memory or in SQL. An
IteratorFilterfilters an in-memoryAnyDataset, and the same filter becomes theWHEREclause of a database query. - Combine sources.
import()any iterator into anAnyDatasetto 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
- AnyDataset Overview - Core component overview and usage
- The Row Object - Working with data rows
- Iterators - Different ways to iterate through data
Advanced Features
- Filtering Results - How to filter your data
- Formatting Output - Transform your data into different formats
- Field Validation - Validate your data against rules
- Data Population - Populate objects with data
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