投稿者 |
メッセージ |
|
< PHPプログラミング ~ テキストデータの検索について |
|
時間:
土 8月 04, 2007 3:39 pm
|
|
|
|
たとえば、「data.txt」に
0,0,1,0,0,1
1,0,0,1,0,0
0,1,1,0,0,0
0,0,0,0,1,0
0,1,1,0,0,0
というデータがあるとします。
列をそれぞれ、「a,b,c,d,e,f」として、
$data = file("data.txt");
for($i = 0; $i < sizeof($data); $i++){
list($a,$b,$c,$d,$e,$f) = split(",", $data[$i]);
}
のように展開したあと、postなどで
$a2 = 0; $b2 = 1; $c2 = 1; $d2 = 0; $e2 = 0; $f2 = 0;
という値がPHPに送られたとき、「data.txt」の3行目と5行目の値が表示されるようにしたいのですが、どのようにすればいいのでしょうか。
また、
$a2 = 0; $b2 = 0; $c2 = 0; $d2 = 1; $e2 = 1; $f2 = 0;
という値の時、OR検索のように2行目と4行目の値が表示される方法もお願いします。[/code] |
|
|
|
|
|
|
|
時間:
日 8月 05, 2007 6:56 pm
|
|
|
登録日: 2006年8月 19日
投稿記事: 19
|
|
そのプログラムだと展開後は最後の行しか得られないのでは…
01データ以外には使えませんが,ビット演算を使えばその手の比較は一瞬でできてらくちんです
ただしANDとORが感覚とずれるので注意
Code: |
//注このプログラムは検索列数が32 (もしかすると16か31?)を超えないことを前提としています
//POSTのビット化
$ord = ord("a");
$flag = $i = 0;
while (array_key_exists(($key = chr($ord + $i++) . "2"), $_POST))
{
$flag = ($flag << 1) + $_POST[$key];
}
/*
//左詰の場合(上記は右詰で,たとえば"$f2"がない場合romさんの例で$a2と$bの比較になる)
$max = ord("f") - $ord;
while ($i < $max && array_key_exists(($key = chr($ord + $i) . "2"), $_POST))
{
$flag += $_POST[$key] << ($max - $i++);
}
*/
$data = file("data.txt");
$size = sizeof($data); //このようにするとsizeofを一度しか呼ばないため早いらしい
for($i = 0; $i < $size; $i++){
$bit = bindec(preg_replace("/[^01]/", $data[$i])); //01以外の文字をすべて取り除きビット化
if ($bit == $flag)
{
//完全一致時の処理
}
if ($bit & $flag)
{
//部分一致時の処理
}
}
|
もしも一般的な文字列を使う場合は設計を見直してもっと比較しやすいデータ構造にすべきです. |
|
|
|
|
|
|
|
時間:
月 8月 06, 2007 6:28 pm
|
|
|
|
ありがとうございます。
参考にさせていただきます。
今度は、データを他のものに置き換えて「data.txt」を、
検索されないデータ1-1,検索されないデータ1-2,A B C
検索されないデータ2-1,検索されないデータ2-2,A B
検索されないデータ3-1,検索されないデータ3-2,C D
検索されないデータ4-1,検索されないデータ4-2,A D
として、列をそれぞれ $d1,$d2,$word とします。
$_POST['Word'] = "A B";がPHPに送られたとき、$wordをAND検索のように検索し、1行目と2行目の$d1と$d2を表示させる、
また、$_POST['Word'] = "B C";のとき、$wordをOR検索のように検索し、1行目と2行目と3行目の$d1と$d2を表示させるにはどうすればいいのでしょうか。
何度もすいません。 |
|
|
|
|
|
|
|
時間:
火 8月 07, 2007 1:03 am
|
|
|
登録日: 2006年8月 19日
投稿記事: 19
|
|
A B Cがトークンなのか文字列なのかで話は変わりますが,その前に…
まず$_POST["Word"] = "A"の時のプログラムを作れますか? |
|
|
|
|
|
|
|
時間:
火 8月 07, 2007 1:01 pm
|
|
|
|
A B Cは文字列です。
AND検索とOR検索ばかりに注目していたので、$_POST["Word"] = "A"のときのプログラムも少し怪しいかもしれないです... |
|
|
|
|
|
|
|
時間:
水 8月 08, 2007 7:21 pm
|
|
|
登録日: 2006年8月 19日
投稿記事: 19
|
|
|
|
|
|
|
時間:
日 7月 29, 2012 11:37 pm
|
|
|
登録日: 2012年7月 23日
投稿記事: 20
所在地: America
|
|
you will find a lot nike dunk shoes from site here:[url=http://angrybirdsnikedunks.blogspot.com/]
[/url] |
_________________ batman nike dunks |
|
|
|
|
|
|
|
新規投稿: 不可 返信: 不可t 自分の記事の編集: 不可 自分の記事の削除: 不可 投票への参加: 不可
|
|