2013-03-11 75 views
1

如您在下面的代碼中看到的,我對三個結構類似的變量使用相同的代碼(foreach循環,數組賦值和尾隨json_decode)三次。我想知道如何優化我的代碼,以便它不會不必要地重複執行功能。變量變量在這種情況下會有幫助嗎?我可以將重複的代碼行移動到第一個foreach聲明中嗎?重構PHP代碼 - 減少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)); 

感謝。如果您有任何問題,請告訴我。

+1

爲什麼要動態地創建變量名但不只是使用關聯數組? – 2013-03-11 02:51:11

+0

這是一個我一直想知道的問題,如何爲相同數量的元素和每個元素在同一時間對多個數組進行foreach循環。 – 2013-03-11 03:08:38

回答

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); 
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)); 
} 
+0

我喜歡這個解決方案的想法,因爲只需向'$ stocks'數組中添加一個項目就可以很容易地添加數據,但是當我嘗試使用此代碼(也添加到URL中)時,它不起作用。 – 585connor 2013-03-11 03:14:22

+0

哪部分沒有工作?它不是你正在尋找的輸出格式,還是它會拋出錯誤?它正在使用我的本地設置。 – fuzic 2013-03-11 03:18:59

+0

我正在使用Highcharts(jQuery數據可視化插件)實現中的數據,由於某些原因數組沒有被傳遞到我的JS中。 – 585connor 2013-03-11 03:28:18