Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.
<?php

namespace PhpOffice\PhpSpreadsheet\Calculation\LookupRef;

> use PhpOffice\PhpSpreadsheet\Calculation\ArrayEnabled;
use PhpOffice\PhpSpreadsheet\Calculation\Exception;
< use PhpOffice\PhpSpreadsheet\Calculation\Functions;
> use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
class Matrix {
> use ArrayEnabled; /** > * TRANSPOSE. > /** * > * Helper function; NOT an implementation of any Excel Function. * @param array|mixed $matrixData A matrix of values > */ * > public static function isColumnVector(array $values): bool * @return array > { */ > return count($values, COUNT_RECURSIVE) === (count($values, COUNT_NORMAL) * 2); public static function transpose($matrixData) > } { > $returnMatrix = []; > /** if (!is_array($matrixData)) { > * Helper function; NOT an implementation of any Excel Function. $matrixData = [[$matrixData]]; > */ } > public static function isRowVector(array $values): bool > { $column = 0; > return count($values, COUNT_RECURSIVE) > 1 && foreach ($matrixData as $matrixRow) { > (count($values, COUNT_NORMAL) === 1 || count($values, COUNT_RECURSIVE) === count($values, COUNT_NORMAL)); $row = 0; > } foreach ($matrixRow as $matrixCell) { >
$returnMatrix[$row][$column] = $matrixCell; ++$row; } ++$column; } return $returnMatrix; } /** * INDEX. * * Uses an index to choose a value from a reference or array * * Excel Function: * =INDEX(range_array, row_num, [column_num], [area_num]) * * @param mixed $matrix A range of cells or an array constant * @param mixed $rowNum The row in the array or range from which to return a value. * If row_num is omitted, column_num is required.
> * Or can be an array of values
* @param mixed $columnNum The column in the array or range from which to return a value. * If column_num is omitted, row_num is required.
> * Or can be an array of values
* * TODO Provide support for area_num, currently not supported * * @return mixed the value of a specified cell or array of cells
> * If an array of values is passed as the $rowNum and/or $columnNum arguments, then the returned result */ > * will also be an array with the same dimensions
public static function index($matrix, $rowNum = 0, $columnNum = 0) {
< $rowNum = ($rowNum === null) ? 0 : Functions::flattenSingleValue($rowNum); < $columnNum = ($columnNum === null) ? 0 : Functions::flattenSingleValue($columnNum);
> if (is_array($rowNum) || is_array($columnNum)) { > return self::evaluateArrayArgumentsSubsetFrom([self::class, __FUNCTION__], 1, $matrix, $rowNum, $columnNum); > } > > $rowNum = $rowNum ?? 0; > $columnNum = $columnNum ?? 0;
try { $rowNum = LookupRefValidations::validatePositiveInt($rowNum); $columnNum = LookupRefValidations::validatePositiveInt($columnNum); } catch (Exception $e) { return $e->getMessage(); } if (!is_array($matrix) || ($rowNum > count($matrix))) {
< return Functions::REF();
> return ExcelError::REF();
} $rowKeys = array_keys($matrix); $columnKeys = @array_keys($matrix[$rowKeys[0]]); if ($columnNum > count($columnKeys)) {
< return Functions::REF();
> return ExcelError::REF();
} if ($columnNum === 0) { return self::extractRowValue($matrix, $rowKeys, $rowNum); } $columnNum = $columnKeys[--$columnNum]; if ($rowNum === 0) { return array_map( function ($value) { return [$value]; }, array_column($matrix, $columnNum) ); } $rowNum = $rowKeys[--$rowNum]; return $matrix[$rowNum][$columnNum]; } private static function extractRowValue(array $matrix, array $rowKeys, int $rowNum) { if ($rowNum === 0) { return $matrix; } $rowNum = $rowKeys[--$rowNum]; $row = $matrix[$rowNum]; if (is_array($row)) { return [$rowNum => $row]; } return $row; } }