1

以下のコードでわかるように、同様に構造化された 3 つの変数に対して、同じコード (foreach配列代入と末尾のループjson_decode) を 3 回使用しています。不必要に機能を繰り返さないようにコードを最適化する方法を考えています。この状況で可変変数は役に立ちますか? コードの繰り返し行を最初の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));

ありがとう。ご不明な点がございましたら、お知らせください。

4

2 に答える 2

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));
}
于 2013-03-11T02:55:06.950 に答える
1

3つのループについては、次を試してください。

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);
于 2013-03-11T03:05:47.650 に答える