■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。
このフォーラムは閲覧専用のアーカイブです。

課題 #997 について

localdisk > 課題 #997 について @ 2010/6/12 21:17
課題 #997 のスクリプトを自分なりに簡潔にしてみました。
スピードは測ってないからわかりませんが、よかったら参考にして下さい。
<?php

$file = array(1, 7, 10, 8, 0, 4, 6, 8, 5, 2, 3, 4, 3, 0, 0, 11, 1000, 9);
$max = 9;
$conditions = 9;
$order = 'DESC';

var_dump(getArticle($file, $conditions, $max, $order));

function getArticle($file, $offset, $limit, $order) {
    $ret = array();
    switch ($order) {
        case 'ASC':
            arsort($file);
            $file = array_values($file);
            break;
        case 'DESC':
            asort($file);
            $file = array_values($file);
            break;
        default:
            throw new Exception('order word ASC or DESC.');
    }
    while (array_search($offset, $file) === false) {
        $offset = $order === 'DESC' ? ++$offset : --$offset;
        $pos = $order === 'DESC' ? count($file) - 1 : 0;
        if ($order === 'ASC') {
            if ($file[$pos] <= $offset)
                continue;
        } else {
            if ($file[$pos] >= $offset)
                continue;
        }
        throw new Exception('not found.');
    }
    $index = array_search($offset, $file);
    return array_slice($file, $index, $limit);
}

ryuring > Re: 課題 #997 について @ 2010/6/13 11:27
localdiskさんアドバイスありがとうございます。
PHPならではの配列処理で簡潔に書かれてていい感じですね。
是非参考にさせて頂きます!

が、この課題の問題点はそこではなく、
$fileはあくまでもCSVファイルで、できるだけメモリ上におかずに処理をさせたいという事なんです。
※ 配列の要素一つが1行というイメージですね。
この処理だと、全てのデータをオンメモリで asort する事が前提となってますので、
大量のデータを扱う場合の問題が解決できません。
こちらもアドバイス頂けると助かりますー!

このページのreadCSVメソッドと、_readCSVメソッド、2つが実際の改善対象部分です。

≫ 課題997
http://project.e-catchup.jp/issues/997

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ