mapping de valeurs

This commit is contained in:
Jephté Clain 2024-05-23 18:38:19 +04:00
parent 5da28fc142
commit ec7ebfefc1
2 changed files with 24 additions and 4 deletions

View File

@ -78,6 +78,7 @@ class CTable extends ComponentPrintable implements IParametrable {
"rows" => ["?iterable", null, "source des lignes à afficher"],
"filter_func" => ["?callable", null, "fonction permettant de filter les éléments à afficher"],
"map_func" => ["?callable", null, "fonction permettant de mapper les éléments"],
#XXX ajouter "map" qui prend directement un tableau comme celui retourné par map_func()
"cols" => ["?array", null, "colonnes à extraire et à afficher"],
"exclude_cols" => ["?array", null, "colonnes à exclure de la liste calculée automatiquement"],
"add_cols" => ["?array", null, "colonnes à ajouter à la liste calculée automatiquement"],
@ -358,10 +359,29 @@ class CTable extends ComponentPrintable implements IParametrable {
$mapCtx = $this->mapCtx;
$row = $this->_currentRow($this->rowKey);
if ($filterCtx !== null) {
if (!func::_call($filterCtx, [$row, $this->rowKey])) return null;
if (!func::_call($filterCtx, [$row, $this->rowKey, $this->rowIndex])) return null;
}
if ($mapCtx !== null) {
# si la valeur est séquentielle, c'est une clé dans $row
# si la valeur est associative et que c'est une fonction, elle est appelée
# avec la valeur
$result = func::_call($mapCtx, [$row, $this->rowKey, $this->rowIndex]);
$index = 0;
$mapped = [];
foreach ($result as $key => $value) {
if ($key === $index) {
$index++;
$mapped[$value] = A::get($row, $value);
} elseif (is_callable($value)) {
$mapped[$key] = func::call($value, A::get($row, $key), $key, $row, $this->rowKey, $this->rowIndex);
} else {
$mapped[$key] = $value;
}
}
$row = $mapped;
} else {
$row = $this->ensureArray($row);
}
if ($mapCtx !== null) $row = func::_call($mapCtx, [$row]);
else $row = $this->ensureArray($row);
return $row;
}

View File

@ -44,7 +44,7 @@ class Word {
$spec = substr($spec, strlen($ms[0]));
} elseif (preg_match('/^m(asc(ulin)?)?\s*:\s*/i', $spec, $ms)) {
$fem = false;
$spec = substr($spec, $ms[0]);
$spec = substr($spec, strlen($ms[0]));
} elseif (preg_match('/\s*\|f(?:[eé]m(?:inin)?)?\s*$/iu', $spec, $ms, PREG_OFFSET_CAPTURE)) {
$fem = true;
$spec = substr($spec, 0, $ms[0][1]);