I'm trying to get the correct result for deleted columns and rows in a matrix, but whenever I remove the first column specified in the $columnsToRemove
array, the array shifts, and I end up deleting the wrong column. in the following example, how would I delete both the 0th and the 2nd column in each submatrix in one go?
$matrix = [
[1,0,0,2],
[0,5,0,1],
[0,0,3,5]
];
$rowsToDelete = [1];
$columnsToDelete = [0, 2];
function constructSubmatrix($matrix, $rowsToDelete, $columnsToDelete) {
foreach($rowsToDelete as $row){
array_splice($matrix, $row, 1);
}
foreach($columnsToDelete as $column){
for($i = 0; $i < count($matrix); $i++){
array_splice($matrix[$i], $column, 1);
}
}
return $matrix;
}
The return value should be: [[0,2],[0,5]]
But I keep getting: [[0,0],[0,3]]
Because if you're deleting multiple rows or multiple columns, then deleting the lowest column in that list will mean that the higher column numbers aren't correct any more.
e.g. with $columnsToDelete = [0, 2];
once you've deleted column 0
, then column 2
has become column 1
, but your'e still trying to delete column 2
You need to delete in reverse order to avoid this; so use rsort()
your $rowsToDelete
and $columnsToDelete
before doing the deletion.
function constructSubmatrix($matrix, $rowsToDelete, $columnsToDelete) {
rsort($rowsToDelete);
foreach($rowsToDelete as $row){
array_splice($matrix, $row, 1);
}
rsort($columnsToDelete);
foreach($columnsToDelete as $column){
for($i = 0; $i < count($matrix); $i++){
array_splice($matrix[$i], $column, 1);
}
}
return $matrix;
}