我有以下行读取csv并将每一行转换为Array
$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删除了。我没有同时把它们放在那里,只是把它们都放在那里,这样你就可以看到哪些是有效的,哪些是不可行的。
为什么会这样?
谢谢
你可以通过引用传递你的数组
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>";
}
您只是传递$row
,它也在函数调用中被删除。
但是,您没有返回它(也没有将引用传递给$row
)。
做两个修改:
$row = $reader->unsetColumns($row);
和
public function unsetColumns($row)
{
unset($row['column1']);
return $row;
}
让列删除活动被使用
你可以通过引用来传递当前的$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