init
This commit is contained in:
commit
72a26edcff
22092 changed files with 2101903 additions and 0 deletions
44
lib/PhpSpreadsheet/Calculation/Database/DAverage.php
Normal file
44
lib/PhpSpreadsheet/Calculation/Database/DAverage.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Averages;
|
||||
|
||||
class DAverage extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DAVERAGE.
|
||||
*
|
||||
* Averages the values in a column of a list or database that match conditions you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DAVERAGE(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): string|int|float
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return Averages::average(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
45
lib/PhpSpreadsheet/Calculation/Database/DCount.php
Normal file
45
lib/PhpSpreadsheet/Calculation/Database/DCount.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Counts;
|
||||
|
||||
class DCount extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DCOUNT.
|
||||
*
|
||||
* Counts the cells that contain numbers in a column of a list or database that match conditions
|
||||
* that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DCOUNT(database,[field],criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria, bool $returnError = true): string|int
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($returnError && $field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return Counts::COUNT(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
44
lib/PhpSpreadsheet/Calculation/Database/DCountA.php
Normal file
44
lib/PhpSpreadsheet/Calculation/Database/DCountA.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Counts;
|
||||
|
||||
class DCountA extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DCOUNTA.
|
||||
*
|
||||
* Counts the nonblank cells in a column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DCOUNTA(database,[field],criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): string|int
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return Counts::COUNTA(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
49
lib/PhpSpreadsheet/Calculation/Database/DGet.php
Normal file
49
lib/PhpSpreadsheet/Calculation/Database/DGet.php
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
|
||||
class DGet extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DGET.
|
||||
*
|
||||
* Extracts a single value from a column of a list or database that matches conditions that you
|
||||
* specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DGET(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): null|float|int|string
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
$columnData = self::getFilteredColumn($database, $field, $criteria);
|
||||
if (count($columnData) > 1) {
|
||||
return ExcelError::NAN();
|
||||
}
|
||||
|
||||
$row = array_pop($columnData);
|
||||
|
||||
return array_pop($row);
|
||||
}
|
||||
}
|
||||
45
lib/PhpSpreadsheet/Calculation/Database/DMax.php
Normal file
45
lib/PhpSpreadsheet/Calculation/Database/DMax.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Maximum;
|
||||
|
||||
class DMax extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DMAX.
|
||||
*
|
||||
* Returns the largest number in a column of a list or database that matches conditions you that
|
||||
* specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DMAX(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria, bool $returnError = true): null|float|string
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return $returnError ? ExcelError::VALUE() : null;
|
||||
}
|
||||
|
||||
return Maximum::max(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
45
lib/PhpSpreadsheet/Calculation/Database/DMin.php
Normal file
45
lib/PhpSpreadsheet/Calculation/Database/DMin.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Minimum;
|
||||
|
||||
class DMin extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DMIN.
|
||||
*
|
||||
* Returns the smallest number in a column of a list or database that matches conditions you that
|
||||
* specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DMIN(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria, bool $returnError = true): float|string|null
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return $returnError ? ExcelError::VALUE() : null;
|
||||
}
|
||||
|
||||
return Minimum::min(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
44
lib/PhpSpreadsheet/Calculation/Database/DProduct.php
Normal file
44
lib/PhpSpreadsheet/Calculation/Database/DProduct.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
|
||||
|
||||
class DProduct extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DPRODUCT.
|
||||
*
|
||||
* Multiplies the values in a column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DPRODUCT(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): string|float
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return MathTrig\Operations::product(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
45
lib/PhpSpreadsheet/Calculation/Database/DStDev.php
Normal file
45
lib/PhpSpreadsheet/Calculation/Database/DStDev.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\StandardDeviations;
|
||||
|
||||
class DStDev extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DSTDEV.
|
||||
*
|
||||
* Estimates the standard deviation of a population based on a sample by using the numbers in a
|
||||
* column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DSTDEV(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): float|string
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return StandardDeviations::STDEV(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
45
lib/PhpSpreadsheet/Calculation/Database/DStDevP.php
Normal file
45
lib/PhpSpreadsheet/Calculation/Database/DStDevP.php
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\StandardDeviations;
|
||||
|
||||
class DStDevP extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DSTDEVP.
|
||||
*
|
||||
* Calculates the standard deviation of a population based on the entire population by using the
|
||||
* numbers in a column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DSTDEVP(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): float|string
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return StandardDeviations::STDEVP(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
44
lib/PhpSpreadsheet/Calculation/Database/DSum.php
Normal file
44
lib/PhpSpreadsheet/Calculation/Database/DSum.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\MathTrig;
|
||||
|
||||
class DSum extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DSUM.
|
||||
*
|
||||
* Adds the numbers in a column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DSUM(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria, bool $returnNull = false): null|float|string
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return $returnNull ? null : ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return MathTrig\Sum::sumIgnoringStrings(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
47
lib/PhpSpreadsheet/Calculation/Database/DVar.php
Normal file
47
lib/PhpSpreadsheet/Calculation/Database/DVar.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Variances;
|
||||
|
||||
class DVar extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DVAR.
|
||||
*
|
||||
* Estimates the variance of a population based on a sample by using the numbers in a column
|
||||
* of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DVAR(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*
|
||||
* @return float|string (string if result is an error)
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): string|float
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return Variances::VAR(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
47
lib/PhpSpreadsheet/Calculation/Database/DVarP.php
Normal file
47
lib/PhpSpreadsheet/Calculation/Database/DVarP.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Statistical\Variances;
|
||||
|
||||
class DVarP extends DatabaseAbstract
|
||||
{
|
||||
/**
|
||||
* DVARP.
|
||||
*
|
||||
* Calculates the variance of a population based on the entire population by using the numbers
|
||||
* in a column of a list or database that match conditions that you specify.
|
||||
*
|
||||
* Excel Function:
|
||||
* DVARP(database,field,criteria)
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param null|array|int|string $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*
|
||||
* @return float|string (string if result is an error)
|
||||
*/
|
||||
public static function evaluate(array $database, array|null|int|string $field, array $criteria): string|float
|
||||
{
|
||||
$field = self::fieldExtract($database, $field);
|
||||
if ($field === null) {
|
||||
return ExcelError::VALUE();
|
||||
}
|
||||
|
||||
return Variances::VARP(
|
||||
self::getFilteredColumn($database, $field, $criteria)
|
||||
);
|
||||
}
|
||||
}
|
||||
177
lib/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php
Normal file
177
lib/PhpSpreadsheet/Calculation/Database/DatabaseAbstract.php
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheet\Calculation\Database;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
|
||||
use PhpOffice\PhpSpreadsheet\Calculation\Internal\WildcardMatch;
|
||||
|
||||
abstract class DatabaseAbstract
|
||||
{
|
||||
abstract public static function evaluate(array $database, array|null|int|string $field, array $criteria): null|float|int|string;
|
||||
|
||||
/**
|
||||
* fieldExtract.
|
||||
*
|
||||
* Extracts the column ID to use for the data field.
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param mixed $field Indicates which column is used in the function. Enter the
|
||||
* column label enclosed between double quotation marks, such as
|
||||
* "Age" or "Yield," or a number (without quotation marks) that
|
||||
* represents the position of the column within the list: 1 for
|
||||
* the first column, 2 for the second column, and so on.
|
||||
*/
|
||||
protected static function fieldExtract(array $database, mixed $field): ?int
|
||||
{
|
||||
$field = strtoupper(Functions::flattenSingleValue($field) ?? '');
|
||||
if ($field === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$fieldNames = array_map('strtoupper', array_shift($database));
|
||||
if (is_numeric($field)) {
|
||||
$field = (int) $field - 1;
|
||||
if ($field < 0 || $field >= count($fieldNames)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $field;
|
||||
}
|
||||
$key = array_search($field, array_values($fieldNames), true);
|
||||
|
||||
return ($key !== false) ? (int) $key : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* filter.
|
||||
*
|
||||
* Parses the selection criteria, extracts the database rows that match those criteria, and
|
||||
* returns that subset of rows.
|
||||
*
|
||||
* @param mixed[] $database The range of cells that makes up the list or database.
|
||||
* A database is a list of related data in which rows of related
|
||||
* information are records, and columns of data are fields. The
|
||||
* first row of the list contains labels for each column.
|
||||
* @param mixed[] $criteria The range of cells that contains the conditions you specify.
|
||||
* You can use any range for the criteria argument, as long as it
|
||||
* includes at least one column label and at least one cell below
|
||||
* the column label in which you specify a condition for the
|
||||
* column.
|
||||
*
|
||||
* @return mixed[]
|
||||
*/
|
||||
protected static function filter(array $database, array $criteria): array
|
||||
{
|
||||
$fieldNames = array_shift($database);
|
||||
$criteriaNames = array_shift($criteria);
|
||||
|
||||
// Convert the criteria into a set of AND/OR conditions with [:placeholders]
|
||||
$query = self::buildQuery($criteriaNames, $criteria);
|
||||
|
||||
// Loop through each row of the database
|
||||
return self::executeQuery($database, $query, $criteriaNames, $fieldNames);
|
||||
}
|
||||
|
||||
protected static function getFilteredColumn(array $database, ?int $field, array $criteria): array
|
||||
{
|
||||
// reduce the database to a set of rows that match all the criteria
|
||||
$database = self::filter($database, $criteria);
|
||||
$defaultReturnColumnValue = ($field === null) ? 1 : null;
|
||||
|
||||
// extract an array of values for the requested column
|
||||
$columnData = [];
|
||||
foreach ($database as $rowKey => $row) {
|
||||
$keys = array_keys($row);
|
||||
$key = $keys[$field] ?? null;
|
||||
$columnKey = $key ?? 'A';
|
||||
$columnData[$rowKey][$columnKey] = $row[$key] ?? $defaultReturnColumnValue;
|
||||
}
|
||||
|
||||
return $columnData;
|
||||
}
|
||||
|
||||
private static function buildQuery(array $criteriaNames, array $criteria): string
|
||||
{
|
||||
$baseQuery = [];
|
||||
foreach ($criteria as $key => $criterion) {
|
||||
foreach ($criterion as $field => $value) {
|
||||
$criterionName = $criteriaNames[$field];
|
||||
if ($value !== null) {
|
||||
$condition = self::buildCondition($value, $criterionName);
|
||||
$baseQuery[$key][] = $condition;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$rowQuery = array_map(
|
||||
fn ($rowValue): string => (count($rowValue) > 1) ? 'AND(' . implode(',', $rowValue) . ')' : ($rowValue[0] ?? ''),
|
||||
$baseQuery
|
||||
);
|
||||
|
||||
return (count($rowQuery) > 1) ? 'OR(' . implode(',', $rowQuery) . ')' : ($rowQuery[0] ?? '');
|
||||
}
|
||||
|
||||
private static function buildCondition(mixed $criterion, string $criterionName): string
|
||||
{
|
||||
$ifCondition = Functions::ifCondition($criterion);
|
||||
|
||||
// Check for wildcard characters used in the condition
|
||||
$result = preg_match('/(?<operator>[^"]*)(?<operand>".*[*?].*")/ui', $ifCondition, $matches);
|
||||
if ($result !== 1) {
|
||||
return "[:{$criterionName}]{$ifCondition}";
|
||||
}
|
||||
|
||||
$trueFalse = ($matches['operator'] !== '<>');
|
||||
$wildcard = WildcardMatch::wildcard($matches['operand']);
|
||||
$condition = "WILDCARDMATCH([:{$criterionName}],{$wildcard})";
|
||||
if ($trueFalse === false) {
|
||||
$condition = "NOT({$condition})";
|
||||
}
|
||||
|
||||
return $condition;
|
||||
}
|
||||
|
||||
private static function executeQuery(array $database, string $query, array $criteria, array $fields): array
|
||||
{
|
||||
foreach ($database as $dataRow => $dataValues) {
|
||||
// Substitute actual values from the database row for our [:placeholders]
|
||||
$conditions = $query;
|
||||
foreach ($criteria as $criterion) {
|
||||
$conditions = self::processCondition($criterion, $fields, $dataValues, $conditions);
|
||||
}
|
||||
|
||||
// evaluate the criteria against the row data
|
||||
$result = Calculation::getInstance()->_calculateFormulaValue('=' . $conditions);
|
||||
|
||||
// If the row failed to meet the criteria, remove it from the database
|
||||
if ($result !== true) {
|
||||
unset($database[$dataRow]);
|
||||
}
|
||||
}
|
||||
|
||||
return $database;
|
||||
}
|
||||
|
||||
private static function processCondition(string $criterion, array $fields, array $dataValues, string $conditions): mixed
|
||||
{
|
||||
$key = array_search($criterion, $fields, true);
|
||||
|
||||
$dataValue = 'NULL';
|
||||
if (is_bool($dataValues[$key])) {
|
||||
$dataValue = ($dataValues[$key]) ? 'TRUE' : 'FALSE';
|
||||
} elseif ($dataValues[$key] !== null) {
|
||||
$dataValue = $dataValues[$key];
|
||||
// escape quotes if we have a string containing quotes
|
||||
if (is_string($dataValue) && str_contains($dataValue, '"')) {
|
||||
$dataValue = str_replace('"', '""', $dataValue);
|
||||
}
|
||||
$dataValue = (is_string($dataValue)) ? Calculation::wrapResult(strtoupper($dataValue)) : $dataValue;
|
||||
}
|
||||
|
||||
return str_replace('[:' . $criterion . ']', $dataValue, $conditions);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue