Merge pull request #3197 from PHPOffice/BugFix_Default-arguments-for-TEXTJOIN

Support null and empty values in TEXTJOIN()
This commit is contained in:
Mark Baker
2022-11-21 15:02:45 +01:00
committed by GitHub
2 changed files with 36 additions and 13 deletions
@@ -56,7 +56,7 @@ class Concatenate
* If an array of values is passed for the $delimiter or $ignoreEmpty arguments, then the returned result
* will also be an array with matching dimensions
*/
public static function TEXTJOIN($delimiter, $ignoreEmpty, ...$args)
public static function TEXTJOIN($delimiter = '', $ignoreEmpty = true, ...$args)
{
if (is_array($delimiter) || is_array($ignoreEmpty)) {
return self::evaluateArrayArgumentsSubset(
@@ -68,29 +68,35 @@ class Concatenate
);
}
// Loop through arguments
$delimiter ??= '';
$ignoreEmpty ??= true;
$aArgs = Functions::flattenArray($args);
$returnValue = '';
$returnValue = self::evaluateTextJoinArray($ignoreEmpty, $aArgs);
$returnValue ??= implode($delimiter, $aArgs);
if (StringHelper::countCharacters($returnValue) > DataType::MAX_STRING_LENGTH) {
$returnValue = ExcelError::CALC();
}
return $returnValue;
}
private static function evaluateTextJoinArray(bool $ignoreEmpty, array &$aArgs): ?string
{
foreach ($aArgs as $key => &$arg) {
$value = Helpers::extractString($arg);
if (ErrorValue::isError($value)) {
$returnValue = $value;
break;
return $value;
}
if ($ignoreEmpty === true && is_string($arg) && trim($arg) === '') {
if ($ignoreEmpty === true && ((is_string($arg) && trim($arg) === '') || $arg === null)) {
unset($aArgs[$key]);
} elseif (is_bool($arg)) {
$arg = Helpers::convertBooleanValue($arg);
}
}
$returnValue = ($returnValue !== '') ? $returnValue : implode($delimiter, $aArgs);
if (StringHelper::countCharacters($returnValue) > DataType::MAX_STRING_LENGTH) {
$returnValue = ExcelError::CALC();
}
return $returnValue;
return null;
}
/**
@@ -15,6 +15,22 @@ return [
'1-2-3',
['-', true, 1, 2, 3],
],
[
'A-B-C-E',
['-', true, 'A', 'B', 'C', null, 'E'],
],
[
'A-B-C--E',
['-', false, 'A', 'B', 'C', null, 'E'],
],
[
'A-B-C-',
['-', false, 'A', 'B', 'C', null],
],
[
'A-B-C--',
['-', false, 'A', 'B', 'C', null, null],
],
[
'<<::>>',
['::', true, '<<', '>>'],
@@ -64,4 +80,5 @@ return [
],
'propagate REF' => ['#REF!', [',', true, '1', '=sheet99!A1', '3']],
'propagate NUM' => ['#NUM!', [',', true, '1', '=SQRT(-1)', '3']],
'propagate DIV0' => ['#DIV/0!', [',', true, '1', '=12/0', '3']],
];