正如您在下面的代码中看到的那样,对于结构相似的三个变量,我使用相同的代码(foreach
循环,数组赋值和尾随json_decode
)三次。我想知道如何优化我的代码,以便它不会不必要地重复功能。变量变量在这种情况下会有所帮助吗?我可以将重复的代码行移到第一个foreach
语句中吗?
以下是我的代码现在的样子:
date_default_timezone_set('America/Los_Angeles');
$stocks = array('MSFT' => 'http://ichart.finance.yahoo.com/table.csv?s=MSFT', 'AAPL' => 'http://ichart.finance.yahoo.com/table.csv?s=AAPL', 'FB' => 'http://ichart.finance.yahoo.com/table.csv?s=FB', 'ZNGA' => 'http://ichart.finance.yahoo.com/table.csv?s=ZNGA');
foreach ($stocks as $key=>$stock) {
$fh = fopen($stock, 'r');
$header = fgetcsv($fh);
$varname = $key . '_data';
$$varname = array();
while ($line = fgetcsv($fh)) {
${$varname}[count($$varname)] = array_combine($header, $line);
}
fclose($fh);
}
foreach($MSFT_data as $val){
$MSFT[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$MSFT = json_encode(array_reverse($MSFT));
foreach($AAPL_data as $val){
$AAPL[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$AAPL = json_encode(array_reverse($AAPL));
foreach($FB_data as $val){
$FB[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$FB = json_encode(array_reverse($FB));
感谢。如果您有任何问题,请告诉我。
答案 0 :(得分:1)
您可以使用关联数组,为每个库存键存储数据数组,并在该嵌套数组上使用嵌套的foreach
。
这样的事情:
$res = array();
$stocks = array('MSFT' => '...', 'AAPL' => '...', 'FB' => '...', 'ZNGA' => '...');
foreach ($stocks as $stock => $url) {
$fh = fopen($url, 'r');
$header = fgetcsv($fh);
$res[$stock] = array();
while ($line = fgetcsv($fh)) {
$res[$stock][] = array_combine($header, $line);
}
fclose($fh);
}
$json = array();
foreach ($res as $stock => $data) {
$out = array();
foreach($data as $val){
$out[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
$json[$stock] = json_encode(array_reverse($out));
}
答案 1 :(得分:1)
对于三个循环,请尝试:
function dateCloseLoop($data) {
foreach($data as $val){
$tmp[] = array((strtotime($val['Date']) * 1000), ((float)$val['Close']));
}
return json_encode(array_reverse($tmp));
}
所以你的代码应该是这样的:
$MSFT = dateCloseLoop($MSFT_data);
$AAPL = dateCloseLoop($AAPL_data);
$FB = dateCloseLoop($FB_data);