人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

何処が間違っているのか教えて下さい。

<pre>
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$data = array(
'ほげほげ',
'- 田中 E A C B C E D',
'6 鈴木 C B B B A C D',);

foreach($data as $val){
$pattern="/(^\w\s)(..)(\s)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])/";
$rank='';
if(preg_match($pattern,$val,$match)){
if('$match[$18]' == 'S'){
$rank='6';
}elseif('$match[$18]' == 'A'){
$rank='6';
}elseif('$match[$18]' == 'B'){
$rank='4';
}elseif('$match[$18]' == 'C'){
$rank='3';
}elseif('$match[$18]' == 'D'){
$rank='2';
}elseif('$match[$18]' == 'E'){
$rank='1';
}
}
print $val.$rank."<br>\n";
}
?>
</pre>

エラーは出ないのですが、$valだけが表示され、
$rankの数値が追加されません。
ご教授いただければ幸いです。
宜しくお願い申し上げます。

●質問者: himedaisan
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AS PHP print けが ほげほげ
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● Km1967
●17ポイント

いろいろある。


(1)結果的に、どのような形の出力を求めているのかが書かれていない。

何をすれば正しいのかが伝わってきていない。回答者はエスパーではないぞ。

以下、とりあえず気づいた点だ。


(2)正規表現にマッチしていない

動作確認用の出力を入れてみよ。正規表現が正しく無いことが判るはずだ。

 if(preg_match($pattern, $val, $match)){
 echo "マッチ!";
 } else {
 echo "ノーマッチ!";
 }

以下は一例だ。必要の無い(かっこ)は無駄だから削るほうが良いぞ。

$pattern = "/^.\s.+?\s([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])/";

(3)$18とは何だ?

書くとすれば以下のような形になるはずだ。シングルクォートで囲んでしまうと文字列として認識されてしまうぞ。変数の中身が必要ならシングルクォートで囲む。

 if($match[$18] == 'S'){

どういった結果になれば良いのかが判らないと、こんなところだ。

◎質問者からの返答

error_reporting(E_ALL);

ini_set('display_errors', '1');

$data = array(

'ほげほげ',

'- 田中 E A C B C E D',

'6 鈴木 C B B B A C D',);

foreach($data as $val){

$pattern="/(^.\s)(..)(\s)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])/";

$rank='';

if(preg_match($pattern,$val,$match)){

if($match[4] == 'S'){

$rank='6';

}elseif($match[4] == 'A'){

$rank='6';

}elseif($match[4] == 'B'){

$rank='4';

}elseif($match[4] == 'C'){

$rank='3';

}elseif($match[4] == 'D'){

$rank='2';

}elseif($match[4] == 'E'){

$rank='1';

}

}

print $val.$rank."
\n";

}

?>

表示結果は$dataだけがそのまま表示されるので、

$patternの4番目がA?Zにマッチした場合には、対応した数値を行末に追加したいのです。

■現状の表示結果

ほげほげ

6 鈴木 C B B B A C D

■表示結果希望

ほげほげ

6 鈴木 C B B B A C D3

改めて宜しくお願いいたします。


2 ● ホーエンハイム
●17ポイント

どのような処理をしたいのかお知らせください。


まず第一に、下記の正規表現だと、$dataのどの要素にもマッチしません。したがって、if文以下のどれも実行されません。

$pattern="/(^\w\s)(..)(\s)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])/";

次に、たとえマッチしたとしても、'$match[$18]' という表記は間違えで、$match[18] のようにしてください。

◎質問者からの返答

見難くて申し訳ございません。

以下、再度記載します。

error_reporting(E_ALL);

ini_set('display_errors', '1');

$data = array(

'ほげほげ',

'- 田中 E A C B C E D',

'6 鈴木 C B B B A C D',);

foreach($data as $val){

$pattern="/(^.\s)(..)(\s)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])/";

$rank='';

if(preg_match($pattern,$val,$match)){

if($match[4] == 'S'){

$rank='6';

}elseif($match[4] == 'A'){

$rank='6';

}elseif($match[4] == 'B'){

$rank='4';

}elseif($match[4] == 'C'){

$rank='3';

}elseif($match[4] == 'D'){

$rank='2';

}elseif($match[4] == 'E'){

$rank='1';

}

}

print $val.$rank."
\n";

}

?>

表示結果は$dataだけがそのまま表示されるので、

$patternの4番目がA?Zにマッチした場合には、対応した数値を行末に追加したいのです。

■現状の表示結果

ほげほげ

6 鈴木 C B B B A C D

■表示結果希望

ほげほげ

6 鈴木 C B B B A C D3

改めて宜しくお願いいたします。


3 ● きゃづみぃ
●17ポイント

質問の仕方が 間違ってます。

どういうことを やりたいのか まず仕様を説明し、それから現在 どのようなプログラムなのかソースを提示し、問題となっていることを 出すべきです。

それさえ 提示できれば、希望の回答がくる確率が高くなります。

◎質問者からの返答

申し訳ございません。

記載内容に誤りがありました。

error_reporting(E_ALL);

ini_set('display_errors', '1');

$data = array(

'ほげほげ',

'- 田中 E A C B C E D',

'6 鈴木 C B B B A C D',);

foreach($data as $val){

$pattern="/(^.\s)(..)(\s)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])(\s+)([A-Z])/";

$rank='';

if(preg_match($pattern,$val,$match)){

if($match[4] == 'S'){

$rank='6';

}elseif($match[4] == 'A'){

$rank='6';

}elseif($match[4] == 'B'){

$rank='4';

}elseif($match[4] == 'C'){

$rank='3';

}elseif($match[4] == 'D'){

$rank='2';

}elseif($match[4] == 'E'){

$rank='1';

}

}

print $val.$rank."
\n";

}

?>

表示結果は$dataだけがそのまま表示されるので、

$patternの4番目がA?Zにマッチした場合には、対応した数値を行末に追加したいのです。

■現状の表示結果

ほげほげ

6 鈴木 C B B B A C D

■表示結果希望

ほげほげ

6 鈴木 C B B B A C D3

改めて宜しくお願いいたします。


4 ● Km1967
●17ポイント

正規表現は動かぬから書き直した。それにあわせてifも書き直してある。

Aのときは6ではなく5であろうから勝手に直した。確認用のechoは後からはずせばいい。

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$data = array(
'ほげほげ',
'- 田中 E A C B C E D',
'6 鈴木 C B B B A C D',);

foreach($data as $val){
 $pattern = "/^.\s.+?\s([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])\s+([A-Z])/";
 $rank='';
 if(preg_match($pattern, $val, $match)){
 echo "マッチ!";
 if($match[1] == 'S'){
 $rank = '6';
 }elseif($match[1] == 'A'){
 $rank = '5';
 }elseif($match[1] == 'B'){
 $rank = '4';
 }elseif($match[1] == 'C'){
 $rank = '3';
 }elseif($match[1] == 'D'){
 $rank = '2';
 }elseif($match[1] == 'E'){
 $rank = '1';
 }
 } else {
 echo "ノーマッチ!";
 }
 echo $val . $rank . "<br>\n";
}
?>

結果出力(田中は E だから 1、鈴木は C だから 3)

ノーマッチ!ほげほげ<br>
マッチ!- 田中 E A C B C E D1<br>
マッチ!6 鈴木 C B B B A C D3<br>

コードの読みやすさを考えれば if を並べるより switch のほうがスマートだろう。

一度にやると頭が混乱するだろうから 今は、下のURLだけ控えておけばいい。時間と気持ちの余裕が出来たら読んでみよ。

http://php.net/manual/ja/control-structures.switch.php

◎質問者からの返答

ご丁寧にどうも有難うございました。

大変助かりました。


5 ● ホーエンハイム
●17ポイント

preg_matchを使っているのがよろしくないと存じます。

勝手ながら、preg_matchをpreg_splitに変更し、if-elseif文をcase文に変更させていただきました。

また、これが正しい結果を示すのは、内部エンコーディングがutf-8の場合です。ご留意ください。

<pre>
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

$data = array(
'ほげほげ',
'- 田中 E A C B C E D',
'6 鈴木 C B B B A C D'
);

foreach ($data as $val){
 $rank='';
 $match = preg_split('/[ ]+/u', $val);
 if (isset($match[2])) {
 switch ($match[2]) {
 case 'S': $rank = '6'; break;
 case 'A': $rank = '6'; break;
 case 'B': $rank = '4'; break;
 case 'C': $rank = '3'; break;
 case 'D': $rank = '2'; break;
 case 'E': $rank = '1'; break;
 }
 }
 print $val . $rank . "<br>\n";
}
?>
</pre>
◎質問者からの返答

ご丁寧にどうも有難うございました。

大変助かりました。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ