2015-09-16 2 views
3

У меня есть следующая строка, которая считывает CSV и превращает каждую строку в массивPHP Сброс переменных данных в массиве

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

Так что, если я тогда делать

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

Он выводит данные, как так

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

Скажите, что я хотел, чтобы удалить column1 внутри цикла в то время как я могу поместить

unset($row['column1']); 

И это удалит колонку1 с выхода. Однако, если поместить функцию в моем $ классе читателя как так

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>"; 
} 

Тогда вызов функции не удаляет столбец, но снята с охраны делает. У меня нет обоих одновременно, просто поставьте их обоих, чтобы вы могли видеть, что работает, а что нет.

Зачем это было?

Благодаря

ответ

1

Вы можете передать ваш массив по ссылке можно прочитать здесь больше на 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>"; 
} 
1

Вы просто проходящие $row, он становится удален во время вызова функции также.

Но вы не возвращаете его (и вы не передаёте ссылку на $row).

Есть два изменения:

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

И

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

Так, что ваша колонка делеция активность привыкает.

1

Вы можете передать текущую $row ссылкой, чтобы манипулировать внутри функции, а также видеть эти изменения за пределами области действия.

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

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

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

Разница в существующий код является дополнительным амперсанд перед именем аргумента: &$row в объявлении функции.

См: http://php.net/manual/en/language.references.pass.php

Смежные вопросы