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

php5.2.2の配列でのキーワードマッチ関する質問です。
data_arrayの文章で、key_arrayのキーワードとマッチする文字に<strong>タグをつけたいのです。
その際、field_arrayに対応する要素が対象です。
どのように書けばいいですか?よろしくお願いします。

1)key_arrayはユーザーが入力するワードで、要素数は不確定です。
2)field_arrayの要素数も内容も変化しますが、data_arrayの要素名しか入りません。
3)文字コードはutf-8です。

key_array(
[0] => 流行
[1] => AB
[2] => CD
)

field_array(
[0] => name
[1] => review
)

data_array(
[0] => ( [name] => ABERFELDY 流行 [comment] => ABC [review] => 今日は天気がいい)
[1] => ( [name] => BUNNAHABHAIN [comment] => BCD [review] => ABERFELDY など)
[2] => ( [name] => TAMNAVULIN [comment] => CDE [review] => これが流行ってる)
.....
)
↓↓
data_array(
[0] => ( [name] => <strong>AB</strong>ERFELDY <strong>流行</strong> [comment] => ABC [review] => 今日は天気がいい)
[1] => ( [name] => BUNNAH<strong>AB</strong>HAIN [comment] => ABC [review] => <strong>AB</strong>ERFELDY など)
[2] => ( [name] => TAMNVULIN [comment] => ABC [review] => これが<strong>流行</strong>ってる)
.....
)


●質問者: seadwell
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov
●100ポイント ベストアンサー

data_array形式がよくわかりませんがこういうことでしょうか。

<?php
$keys = array('流行','AB','CD');
$fields = array('name','review');

$data = array(
array('name' => 'ABERFELDY 流行', 'comment' => 'ABC', 'review' => '今日は天気がいい'),
array('name' => 'BUNNAHABHAIN', 'comment' => 'BCD', 'review' => 'ABERFELDY など'),
array('name' => 'TAMNAVULIN', 'comment' => 'CDE', 'review' => 'これが流行ってる')
);

function strong($e) {
global $keys, $fields;
foreach ($fields as $field) {
if (isset($e[$field])) {
foreach ($keys as $key) {
$e[$field] = preg_replace('/('.$key.')/u', '<strong>$1</strong>', $e[$field]);
}
}
}
return $e;
}
$data = array_map('strong', $data);


foreach($data as $e) {
print_r($e); echo '<br>';
}

seadwellさんのコメント
ご回答ありがとうございます。 ズバリ待っていました回答です。 array_mapも初めて知りました。勉強になります。 ただ、処理を関数化していますので、変数をうまくスコープできません。 $_SEESION渡しくらいしか考えつかないのですが、strong($e)に変数$keys, $fieldsを渡す妙案はないでしょうか?

Cherenkovさんのコメント
ペーペーなのでよくわかりません。 $keys,$fieldsを$GLOBALSに代入しておいて、関数の中で取り出すとか。 http://php.net/manual/ja/language.variables.scope.php

Cherenkovさんのコメント
$GLOBALS['keys'] = array('流行','AB','CD'); $GLOBALS['fields'] = array('name','review'); function strong($e) { $keys = $GLOBALS['keys']; $fields = $GLOBALS['fields']; foreach ($fields as $field) {

seadwellさんのコメント
ありがとうございます。 $GLOBALSで対応します。
関連質問

●質問をもっと探す●



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