Fix exact MATCH on ranges with empty cells (#1520)
Fixes a bug when doing exact match on ranges with empty cells.
```php
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// Row: 1, null, 4, null, 8.
$sheet->getCell('A1')->setValue(1);
$sheet->getCell('A3')->setValue(4);
$sheet->getCell('A5')->setValue(8);
$sheet->getCell('B1')->setValue('=MATCH(4, A1:A5, 1)');
// Should echo 3, but echos '#N/A'.
echo $sheet->getCell('B1')->getCalculatedValue() . PHP_EOL;
// Row: 1, null, 4, null, null.
$sheet->getCell('C1')->setValue(1);
$sheet->getCell('C3')->setValue(4);
$sheet->getCell('D1')->setValue('=MATCH(5, C1:C5, 1)');
// Should echo 3, but echos '#N/A'.
echo $sheet->getCell('D1')->getCalculatedValue() . PHP_EOL;
```
This commit is contained in:
parent
d8b4c3b26e
commit
73c336ac96
@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Resolve evaluation of utf-8 named ranges in calculation engine [#1522](https://github.com/PHPOffice/PhpSpreadsheet/pull/1522)
|
- Resolve evaluation of utf-8 named ranges in calculation engine [#1522](https://github.com/PHPOffice/PhpSpreadsheet/pull/1522)
|
||||||
|
- Fix exact MATCH on ranges with empty cells [#1520](https://github.com/PHPOffice/PhpSpreadsheet/pull/1520)
|
||||||
|
|
||||||
## [1.13.0] - 2020-05-31
|
## [1.13.0] - 2020-05-31
|
||||||
|
|
||||||
|
|||||||
@ -485,6 +485,13 @@ class LookupRef
|
|||||||
return Functions::NA();
|
return Functions::NA();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($matchType == 1) {
|
||||||
|
// If match_type is 1 the list has to be processed from last to first
|
||||||
|
|
||||||
|
$lookupArray = array_reverse($lookupArray);
|
||||||
|
$keySet = array_reverse(array_keys($lookupArray));
|
||||||
|
}
|
||||||
|
|
||||||
// Lookup_array should contain only number, text, or logical values, or empty (null) cells
|
// Lookup_array should contain only number, text, or logical values, or empty (null) cells
|
||||||
foreach ($lookupArray as $i => $lookupArrayValue) {
|
foreach ($lookupArray as $i => $lookupArrayValue) {
|
||||||
// check the type of the value
|
// check the type of the value
|
||||||
@ -498,17 +505,10 @@ class LookupRef
|
|||||||
$lookupArray[$i] = StringHelper::strToLower($lookupArrayValue);
|
$lookupArray[$i] = StringHelper::strToLower($lookupArrayValue);
|
||||||
}
|
}
|
||||||
if (($lookupArrayValue === null) && (($matchType == 1) || ($matchType == -1))) {
|
if (($lookupArrayValue === null) && (($matchType == 1) || ($matchType == -1))) {
|
||||||
$lookupArray = array_slice($lookupArray, 0, $i - 1);
|
unset($lookupArray[$i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($matchType == 1) {
|
|
||||||
// If match_type is 1 the list has to be processed from last to first
|
|
||||||
|
|
||||||
$lookupArray = array_reverse($lookupArray);
|
|
||||||
$keySet = array_reverse(array_keys($lookupArray));
|
|
||||||
}
|
|
||||||
|
|
||||||
// **
|
// **
|
||||||
// find the match
|
// find the match
|
||||||
// **
|
// **
|
||||||
|
|||||||
@ -97,6 +97,20 @@ return [
|
|||||||
-1,
|
-1,
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// match on ranges with empty cells
|
||||||
|
[
|
||||||
|
3, // Expected
|
||||||
|
4, // Input
|
||||||
|
[1, null, 4, null, 8],
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
3, // Expected
|
||||||
|
5, // Input
|
||||||
|
[1, null, 4, null, null],
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
|
||||||
// 0s are causing errors, because things like 0 == 'x' is true. Thanks PHP!
|
// 0s are causing errors, because things like 0 == 'x' is true. Thanks PHP!
|
||||||
[
|
[
|
||||||
3,
|
3,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user