PHP在数组中取消设置数据

I have the following line which reads a csv and turns each row into an Array

$reader = new CSV\CSVReader('somecsv.csv');

So if I then do

while ($row = $reader->getRow()) {
    print "<pre>";
    print_r($row);
    print "</pre>";
}

It outputs data like so

Array
(
    [Column1] => some
    [Column2] => data
    [Column3] => hi
    [Column4] => wow
    [Column5] => help
)
Array ...

Say I wanted to remove column1, inside the while loop I can place

unset($row['column1']);

And this will remove column1 from the output. However, if I place a function in my $reader class like so

public function unsetColumns($row)
{
    unset($row['column1']);
}

And I change my while loop to the following

while ($row = $reader->getRow()) {
    $reader->unsetColumns($row);  //this does not work
    unset($row['column1']);  //this works
    print "<pre>";
    print_r($row);
    print "</pre>";
}

Then the function call does not remove the column, but the unset does. I dont have both in there at the same time, just put them both there so you can see what works and what does not.

Why would this be?

Thanks

You can pass your array by reference read here more on Passing by Reference

public function unsetColumns(&$row)
{
    unset($row['column1']);
}

while ($row = $reader->getRow()) {
    $reader->unsetColumns($row);  //this does not work
    unset($row['column1']);  //this works
    print "<pre>";
    print_r($row);
    print "</pre>";
}

You are just passing $row, it is getting deleted in function call also.

But, you are not returning it (neither you are passing reference to $row).

Do two changes:

$row = $reader->unsetColumns($row);

And

public function unsetColumns($row)
{
    unset($row['column1']);
    return $row;
}

So, that your column deletion activity gets used.

You can pass the current $row by reference it to manipulate inside a function and also see those changes outside of that functions scope.

<?php
public function unsetColumns( &$row )
{
    unset( $row['column1'] );
}

while( $row = $reader->getRow() ) {
    $reader->unsetColumns( $row );

    print "<pre>";
    print_r($row);
    print "</pre>";
}

The difference to your existing code is the additional ampersand in front of the arguments name: &$row in the function declaration.

See: http://php.net/manual/en/language.references.pass.php