mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-08-31 04:28:51 +00:00
Merge pull request #3197 from PHPOffice/BugFix_Default-arguments-for-TEXTJOIN
Support null and empty values in TEXTJOIN()
This commit is contained in:
@@ -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']],
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user