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--
 | 
						|
}
 |