# How can I rotate a 2d array in php by 90 degrees

I want to rotate a matrix 90 degrees clockwise. This amounts to making the first column in the input the first row of the output, the second column of the input the 2nd row of the output, and the 3rd column of the input the 3rd row of the output. Note that the bottom of the column=the beginning of the row, because of the 90 degree rotation.

For example:

``````\$matrix=    [[1, 2, 3]
[4, 5, 6],
[7, 8, 9]];

rotate90degrees(\$matrix)=      [[7, 4, 1],
[8, 5, 2],
[9, 6, 3]]
``````

What I know is I have first transpose the matrix and then swap the columns to rotate the matrix by 90 degrees. How can this be applied to php?

86

php doesn't have concepts like "transpose" for a matrix without adding some sort of linear algebra library. you can do it natively by eaching through the matrix and swapping some indexes

``````<?php

function rotate90(\$mat) {
\$height = count(\$mat);
\$width = count(\$mat);
\$mat90 = array();

for (\$i = 0; \$i < \$width; \$i++) {
for (\$j = 0; \$j < \$height; \$j++) {
\$mat90[\$height - \$i - 1][\$j] = \$mat[\$height - \$j - 1][\$i];
}
}

return \$mat90;
}

\$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
print_r(\$mat);
//123
//456
//789
print_r(rotate90(\$mat));
//741
//852
//963

\$mat = [[1, 2, 3], [4, 5, 6], [7, 8, 9], ["a", "b", "c"]];
print_r(\$mat);
//123
//456
//789
//abc
print_r(rotate90(\$mat));
//a741
//b852
//c963
``````
Wednesday, March 31, 2021

39

When you set cell values individually, you have the option of setting the datatype explicitly, but when you use the `fromArray()` method, you don't have this option.

However, by default, PHP uses a default value binder to identify datatypes from the values passed, and set the cell datatype accordingly. This default behaviour is defined in a class `/PHPExcel/Cell/DefaultValueBinder.php`.

So you can create your own value binder, as described in the PHPExcel Documentation, that would set every value as a string datatype.

Something like:

``````class PHPExcel_Cell_MyColumnValueBinder extends PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
{
protected \$stringColumns = [];

public function __construct(array \$stringColumnList = []) {
// Accept a list of columns that will always be set as strings
\$this->stringColumns = \$stringColumnList;
}

public function bindValue(PHPExcel_Cell \$cell, \$value = null)
{
// If the cell is one of our columns to set as a string...
if (in_array(\$cell->getColumn(), \$this->stringColumns)) {
// ... then we cast it to a string and explicitly set it as a string
\$cell->setValueExplicit((string) \$value, PHPExcel_Cell_DataType::TYPE_STRING);
return true;
}
// Otherwise, use the default behaviour
return parent::bindValue(\$cell, \$value);
}
}

// Instantiate our custom binder, with a list of columns, and tell PHPExcel to use it
PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_MyColumnValueBinder(['A', 'B', 'C', 'E', 'F']));

\$objPHPExcel = new PHPExcel();
\$objPHPExcel->getActiveSheet()->fromArray(\$dataArray,null,"A2");
``````
Friday, May 28, 2021

40

If your row length is a compile time constant, C++11 allows

``````auto arr2d = new int [nrows][CONSTANT];
``````

See this answer. Compilers like gcc that allow variable-length arrays as an extension to C++ can use `new` as shown here to get fully runtime-variable array dimension functionality like C99 allows, but portable ISO C++ is limited to only the first dimension being variable.

Another efficient option is to do the 2d indexing manually into a big 1d array, as another answer shows, allowing the same compiler optimizations as a real 2D array (e.g. proving or checking that arrays don't alias each other / overlap).

Otherwise, you can use an array of pointers to arrays to allow 2D syntax like contiguous 2D arrays, even though it's not an efficient single large allocation. You can initialize it using a loop, like this:

``````int** a = new int*[rowCount];
for(int i = 0; i < rowCount; ++i)
a[i] = new int[colCount];
``````

The above, for `colCount= 5` and `rowCount = 4`, would produce the following: Don't forget to `delete` each row separately with a loop, before deleting the array of pointers. Example in another answer.

Tuesday, June 1, 2021

13

There's a lot been written about PHPExcel and memory use, and I'm not going to repeat it all here.

Try reading some of the threads on the PHPExcel discussion board discussing the issue, such as this one; or previous answers here on SO such as this one or this one

Tuesday, July 6, 2021

37

Try this one. may be helpful to you.

``````#include <stdio.h>
#include <stdlib.h>

void print_matrix(int rows, int cols, double **mat);
void free_matrix(int rows, double **mat);

double **mat = (double **) malloc(sizeof(double *)*rows);
int i=0,j=0;
for(i=0; i<rows; i++)
/* Allocate array, store pointer  */
mat[i] = (double *) malloc(sizeof(double)*cols);

for(i=0; i<rows; i++){
for(j=0; j<cols; j++){
scanf("%lf",&mat[i][j]);
}
}
return mat;
}

void print_matrix(int rows, int cols, double **mat){
int i=0,j=0;
for(i=0; i<rows; i++){    /* Iterate of each row */
for(j=0; j<cols; j++){  /* In each row, go over each col element  */
printf("%lf ",mat[i][j]); /* Print each row element */
}
printf("n");
}
}

void free_matrix(int rows, double **mat){
int i=0;
for(i=0;i<rows;i++)
free(mat[i]);
free(mat);
}

int main(){

double **matrix;
int rows, cols;
/* First matrix */
printf("Matrix 1n");
printf("Enter # of rows and cols: ");
scanf("%d%d",&rows,&cols);
printf("Matrix, enter %d reals: n",rows*cols);
printf("Your Matrixn");  /* Print the entered data */
print_matrix(rows,cols,matrix);
free_matrix(rows, matrix);   /* Free the matrix */

return 0;
}
``````

Execution:

``````:~\$ gcc  exam.c
:~\$ ./a.out
Matrix 1
Enter # of rows and cols: 3
4
Matrix, enter 12 reals:
1
2
3
4
5
6
7
8
9
9
0
1