[PHP-users 12658] 配列を束ねて配列にする方法について

Masayuki AOKI php-users@php.gr.jp
Mon, 20 Jan 2003 14:59:37 +0900


 こんにちは,青木@martinです。
自作BBSで,その中に検索スクリプト(仮にSearch($tagertLog)という関数と
します)があるのですが,ログの保存形式はnon-databaseでよくある1行1ス
レッド形式で,その検索スクリプトは,配列に入ったログファイルを走査す
るように組んでます。過去ログは1ファイル100行のやつが自動的にどんどん
作られるようになっており,その過去ログファイル数は取得可能です。
この際,プログラム上,過去ログ(仮にpast1.log,past2.log,... とします)
は1つの配列に入れてしまって,検索スクリプトを走らせようと思いました。
このとき,個々のファイルは

 file("past1.log") で,配列に入りますが,そのファイル数が,例えば
3つ限定なら,$line1 = file("past1.log"); とでもして,

 $concatArray = array_merge($line1,$line2,$line3);

でOKですが,過去ログ数は変数(既述のようにその数は取得可能)なので,
それようのスクリプトが必要です。そこで,ぼくは以下のようにしたので
すが,何となく力技です。そこで,もっとスマートな,配列のまとめ方など
のアイデアがあればご意見お願いします。


// count($pastlogs) で過去ログのファイル数は取得できるものとする

 if(count($pastlogs)==1){ // 過去ログファイル数が1個なら
  $concatArray = file("past1.log");
 } else {                 // ファイル数が2個以上のとき
  $input = "";
  foreach($pastlogs as $i => $value){
   $end = ($i==count($pastlogs)-1) ? "" : ","; // 最後のやつはカンマなし
   $input .= "file(\"".$value."\")".$end;
  }
  $output = "\$concatArray = array_merge(".$input.");";
  eval($output); // 出来た$output式を評価,$concatArrayで連結配列取得可。
 } 

 // これを,Search($tagetLog) に渡す。

P.S. これでワークするのはします。なお,配列をまとめずに個別に走らせれ
 ば,いうのもありますが,他のスクリプトでも似たような状況があったので
 お知恵を拝借できればと思った次第です。



++++++++++++++++++++++++++++++++++++++++
Department of Molecular Genetics, 
Division of Molecular Population Genetics,
Medical Institute of Bioregulation,
Kyushu University, Fukuoka, Japan

Masayuki AOKI <info@maokis.com>
URL: http://www.martin.bz
++++++++++++++++++++++++++++++++++++++++