投稿者 メッセージ
<  PHPプログラミング  ~  テキストデータの検索について
rom
投稿1時間: 土 8月 04, 2007 3:39 pm  引用



登録日: 2007年8月 04日
投稿記事: 4

たとえば、「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]
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 日 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)
    {
         //部分一致時の処理
    }
}


もしも一般的な文字列を使う場合は設計を見直してもっと比較しやすいデータ構造にすべきです.
トップに移動
ユーザー情報を表示 メッセージを送信
rom
投稿1時間: 月 8月 06, 2007 6:28 pm  引用



登録日: 2007年8月 04日
投稿記事: 4

ありがとうございます。
参考にさせていただきます。

今度は、データを他のものに置き換えて「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を表示させるにはどうすればいいのでしょうか。

何度もすいません。
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 火 8月 07, 2007 1:03 am  引用



登録日: 2006年8月 19日
投稿記事: 19

A B Cがトークンなのか文字列なのかで話は変わりますが,その前に…
まず$_POST["Word"] = "A"の時のプログラムを作れますか?
トップに移動
ユーザー情報を表示 メッセージを送信
rom
投稿1時間: 火 8月 07, 2007 1:01 pm  引用



登録日: 2007年8月 04日
投稿記事: 4

A B Cは文字列です。
AND検索とOR検索ばかりに注目していたので、$_POST["Word"] = "A"のときのプログラムも少し怪しいかもしれないです...
トップに移動
ユーザー情報を表示 メッセージを送信
ach
投稿1時間: 水 8月 08, 2007 7:21 pm  引用



登録日: 2006年8月 19日
投稿記事: 19

>A B Cは文字列です。
AB Cにたいして$_POST["Word"]="A B"がマッチしてもよいという意味ですか?
これがマッチするか否か,それによって比較関数が代わります.

>$_POST["Word"] = "A"のときのプログラムも少し怪しいかもしれないです...
マニュアルの言語リファレンスすべてと,関数リファレンスの文字列と配列の少なくとも目次(関数一覧と簡単な説明が載っている)を読み考えてみてください.
http://jp.php.net/manual/ja/langref.php
http://jp.php.net/manual/ja/ref.strings.php
http://jp.php.net/manual/ja/ref.array.php

ANDやORはこれがヒントになるかも.
http://www.stackasterisk.jp/tech/program/perl04_01.jsp
この考え方をプログラムにできれば終わりです.

がんばってください.
トップに移動
ユーザー情報を表示 メッセージを送信
#gefrrrsdklk[iririr]
投稿1時間: 日 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
トップに移動
ユーザー情報を表示 メッセージを送信 メールを送信 ウェブサイトに移動 AIMアドレス Yahoo メッセンジャー MSN メッセンジャー
特定期間内の記事を表示:   
All times are GMT +9:00

次のトピックを表示
前のトピックを表示
Page 1 of 1
フォーラム一覧  ~  PHPプログラミング

トピックの新規投稿   返信


 
移動先:  

新規投稿: 不可
返信: 不可t
自分の記事の編集: 不可
自分の記事の削除: 不可
投票への参加: 不可




Powered by phpBB
customized by phpspot.