通过php函数处理CSV


Processing CSV through php function

我制作了一个PHP函数,该函数与API配合使用,向我显示帐户的美元余额。此函数称为:get_balance

function get_balance($account){
$url = 'http://mycompaniesurl.com/' . $account;           // url of website         
global $response;
$ch = curl_init();                                          
curl_setopt($ch, CURLOPT_URL, $url);                        
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);              
curl_setopt($ch, CURLOPT_TIMEOUT, 3);                        
$response = curl_exec($ch);                                 
curl_close($ch);
}

函数get_balance返回变量$response 中的输出

我确信这个函数是有效的,所以我对这个部分没有任何疑问。然而,我正在尝试处理CSV文件中写下的帐号。我用以下代码调用CSV文件:

$file = new SplFileObject("test.csv");
$file->setFlags(SplFileObject::READ_CSV);
$data = call_user_func_array('array_merge', iterator_to_array($file));
$data = array_combine(range(1, count($data)), $data);
extract($data, EXTR_PREFIX_ALL, 'variable');

我正在用一个名为test.csv的csv文件测试我的代码,该文件包含4个地址(第一个地址的余额为0,其他3个地址的差额大于0)。

使用以下代码,我可以在屏幕上打印账号的余额:

get_balance($data[2]);
if ($response > 0){ 
    echo $response,"---------------",$data[2];  
} 

由于$data[1]的余额为0,因此不打印任何内容。$data[2]$data[3]$data[4]的余额大于0,因此它们会将余额与帐号一起返回。

现在我的问题是什么;有没有办法"自动"做到这一点?类似的东西

get_balance($data[]); 

似乎不起作用。这个php文件必须处理的CSV大约有1000个帐号,将来可能会有更多,所以键入get_balance($data[1])get_balance($data[999])将是一项耗时的工作。

有没有一种(简单的)方法可以将该函数应用于所有$data[]

是的,有,称为array_map:

$balanced_data = array_map("get_balance", $data);

这将使$balanced_data为空,因为此时get_balance没有返回,但使用全局变量。将其更改为类似的内容

function get_balance($account){
    $url = 'http://mycompaniesurl.com/' . $account;           // url of website
    $ch = curl_init();                                          
    curl_setopt($ch, CURLOPT_URL, $url);                        
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);              
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);                        
    $response = curl_exec($ch);                                 
    curl_close($ch);
    return $response;
}

如果你不想或不能更改get_balance,你需要一个像这样的变通方法

$max = count($data);
for ($i=0; $i<$max; $i++) {
    $response = 0; // reset to make sure we get a new value
    get_balance($data[$i]);
    $balanced_data[$i] = $response;
}