65 lines
1.9 KiB
PHP
65 lines
1.9 KiB
PHP
<?php
|
|
namespace nur\b\coll;
|
|
|
|
use Iterator;
|
|
use nur\A;
|
|
use nur\b\ValueException;
|
|
|
|
/**
|
|
* Class ArrayView: une vue sur une partie d'un tableau
|
|
*/
|
|
class ArrayView implements IArray, Iterator {
|
|
use TBaseArray, TIterableArray, TGenericArray, TArrayMdBasic, TAutomethods;
|
|
|
|
const _AUTO_GETTERS = null;
|
|
const _AUTO_SETTERS = null;
|
|
const _AUTO_DELETERS = null;
|
|
const _AUTO_CI_GETTERS = null;
|
|
const _AUTO_CI_SETTERS = null;
|
|
const _AUTOGEN_LITERALS = null;
|
|
const _AUTOGEN_METHODS = null;
|
|
|
|
/** @var array schéma des données de cette vue */
|
|
const SCHEMA = null;
|
|
|
|
/** @var array|null référence vers la racine de la source */
|
|
protected $root;
|
|
|
|
function &root(): array {
|
|
return $this->root;
|
|
}
|
|
|
|
/** @var array|null référence vers la racine de la vue */
|
|
protected $data;
|
|
|
|
/**
|
|
* @param $source array|BaseArray le tableau source
|
|
* @param $pkeys array|string chemin de clé vers la racine de la vue
|
|
*/
|
|
function __construct(&$source, $pkeys=null) {
|
|
if ($source === null) $source = [];
|
|
if (is_array($source)) $root =& $source;
|
|
elseif ($source instanceof IArray) $root =& $source->array();
|
|
else throw ValueException::unexpected_type(["array", IArray::class], $source);
|
|
if ($pkeys === "" || $pkeys === null) $pkeys = [];
|
|
if (is_string($pkeys)) $pkeys = explode(".", $pkeys);
|
|
if (!is_array($pkeys)) throw ValueException::unexpected_type(["array", "string"], $pkeys);
|
|
|
|
$data =& $root;
|
|
foreach ($pkeys as $pkey) {
|
|
if (!is_array($data)) $data = [$data];
|
|
elseif (!array_key_exists($pkey, $data)) $data[$pkey] = null;
|
|
$data =& $data[$pkey];
|
|
}
|
|
$key = A::last($pkeys);
|
|
$md = $this->md();
|
|
if ($md !== null) $md->ensureSchema($data, $key);
|
|
$this->data =& $data;
|
|
}
|
|
|
|
# Rajouter ceci dans les classes dérivées:
|
|
#use TArrayMd, TAutoconstsStatic; // ou TArrayMdDynamic, TAutoconstsDynamic
|
|
#const _AUTOGEN_CONSTS = ["" => [self::class, "_AUTOGEN_CONSTS"]];
|
|
##--autogen-dynamic--
|
|
}
|