110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\mapper\item;
 | |
| 
 | |
| use nur\A;
 | |
| use nur\b\params\Tparametrable;
 | |
| use nur\mapper\base\Mapper;
 | |
| 
 | |
| /**
 | |
|  * Class Seq2AssocMapper: transformer un flux de tableaux séquentiels en
 | |
|  * tableaux associatifs
 | |
|  *
 | |
|  * --autogen-properties-and-methods--
 | |
|  * @method bool|null getParseKeys()
 | |
|  * @method array|null getKeys()
 | |
|  * @method bool|null setParseKeys(?bool $value)
 | |
|  * @method array|null setKeys(?array $value)
 | |
|  */
 | |
| class Seq2AssocMapper extends Mapper {
 | |
|   use Tparametrable;
 | |
| 
 | |
|   const PARAMETRABLE_PARAMS_SCHEMA = [
 | |
|     "parse_keys" => ["?bool", null, "faut-il analyser le premier élément du flux pour calculer la liste des clés en entrée?"],
 | |
|     "keys" => ["?array", null, "liste et ordre des clés en entrée"],
 | |
|   ];
 | |
| 
 | |
|   /**
 | |
|    * @var ?bool faut-il analyser le premier élément du flux pour calculer la
 | |
|    * liste des clés en entrée? null signifie que la valeur est dynamique: elle
 | |
|    * vaut ($keys === null)
 | |
|    *
 | |
|    * Si ce champ est vrai, le premier élément est toujours consommé. cependant,
 | |
|    * la liste des champs n'est analysée que si elle n'a pas été spécifiée au
 | |
|    * préalable avec {@link setKeys()}
 | |
|    */
 | |
|   protected $ppParseKeys;
 | |
| 
 | |
|   /**
 | |
|    * @var array liste des champs en entrée dans l'ordre. si cette valeur n'est
 | |
|    * pas spécifiée, elle est calculée à partir du premier élément du flux.
 | |
|    */
 | |
|   protected $ppKeys;
 | |
| 
 | |
|   function _checkKeys(array $keys): bool {
 | |
|     $parseKeys = $this->ppParseKeys;
 | |
|     $setParseKeys = $parseKeys !== null;
 | |
|     if ($parseKeys === null) $parseKeys = $this->ppKeys === null;
 | |
|     if ($parseKeys) {
 | |
|       if ($this->ppKeys === null) $this->ppKeys = $keys;
 | |
|       if ($setParseKeys) $this->ppParseKeys = false;
 | |
|       return true;
 | |
|     }
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   function _mapValues(array $values): array {
 | |
|     $keys = $this->ppKeys;
 | |
|     if ($keys === null) return $values;
 | |
|     $row = [];
 | |
|     $index = 0;
 | |
|     foreach ($keys as $key) {
 | |
|       $row[$key] = A::get($values, $index++, false);
 | |
|     }
 | |
|     return $row;
 | |
|   }
 | |
| 
 | |
|   function mapper($item) {
 | |
|     $values = A::with($item);
 | |
|     if ($this->_checkKeys($values)) return $this->mapToNone();
 | |
|     return $this->_mapValues($values);
 | |
|   }
 | |
| 
 | |
|   #############################################################################
 | |
|   const _AUTOGEN_CONSTS = [
 | |
|     "" => [self::class, "_autogen_consts"],
 | |
|   ];
 | |
|   const _AUTOGEN_LITERALS = /*autogen*/[
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '\\nur\\b\\params\\parametrable_utils::class',
 | |
|     ],
 | |
|     [
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       'self::PARAMETRABLE_PARAMS_SCHEMA',
 | |
|     ],
 | |
|   ];
 | |
|   const _AUTOGEN_METHODS = /*autogen*/[
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '_autogen_methods_getters',
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       null,
 | |
|     ],
 | |
|     [
 | |
|       \nur\b\params\parametrable_utils::class,
 | |
|       '_autogen_methods_setters',
 | |
|       self::PARAMETRABLE_PARAMS_SCHEMA,
 | |
|       null,
 | |
|     ],
 | |
|   ];
 | |
|   const _AUTO_GETTERS = /*autogen*/[
 | |
|     'getParseKeys' => 'parse_keys',
 | |
|     'getKeys' => 'keys',
 | |
|   ];
 | |
|   const _AUTO_SETTERS = /*autogen*/[
 | |
|     'setParseKeys' => 'parse_keys',
 | |
|     'setKeys' => 'keys',
 | |
|   ];
 | |
|   #--autogen-dynamic--
 | |
| }
 |