我有以下行读取csv并将每行转换为数组
$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,在while循环中我可以放置
unset($row['column1']);
这将从输出中删除column1。但是,如果我在我的$ reader类中放置一个函数,那么
public function unsetColumns($row)
{
unset($row['column1']);
}
我将while循环更改为以下
while ($row = $reader->getRow()) {
$reader->unsetColumns($row); //this does not work
unset($row['column1']); //this works
print "<pre>";
print_r($row);
print "</pre>";
}
然后函数调用不会删除列,但是unset会删除。我没有同时在那里,只是将它们放在那里,这样你就可以看到哪些有用,哪些无效。
为什么会这样?
由于
答案 0 :(得分:1)
您只是传递$row
,它也会在函数调用中被删除。
但是,你没有归还它(你没有传递对$row
的引用)。
做两处改动:
$row = $reader->unsetColumns($row);
和
public function unsetColumns($row)
{
unset($row['column1']);
return $row;
}
因此,您的列删除活动已被使用。
答案 1 :(得分: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
在函数声明中。
答案 2 :(得分: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>";
}