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

PHP

連想配列の検索方法の仕方に関する質問


質問が長くなりましたので、
http://webtomake.hatenablog.com/entry/2015/08/21/165038
をご覧くさい。


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

▽最新の回答へ

1 ● a-kuma3
●100ポイント

こんな感じでどうでしょう。

<?php

function markup_same_route($a, $b) {
 foreach ($b as $i) {
 if (array_search($i, $a)) {
 $c[] = '' . $i . '';
 } else {
 $c[] = $i;
 }
 }

 $s = implode('|', $c);

 $n = count($b);
 while ($n > 0) {
 $s2 = preg_replace('/→(.*?)★\|★\1→/', '→\1|\1→', $s);
 if ($s == $s2) {
 break;
 } else {
 $s = $s2;
 }
 $n = $n - 1;
 }

 $c = explode('|', $s);

 return $c;
}

// test

$a = ...
$b = ...

$c = markup_same_route($a, $b);
print_r($c);

?>

ideone.com で試したのがこちらです。
http://ideone.com/6BkWBT


webtomakeさんのコメント
a-kuma3さん いつも素晴らしいご回答ありがとうございます。 大変申し訳ないのですが、変数に入る値が「北千住→日暮里」の様に必ずしも「→」で区切られない為、ご提示頂いた正規表現では対応できない箇所もあります。 質問文でしっかりと明記しておくべきでした。 社内のスタッフが出発地と到着地をフリーテキストで入力するのですが、「北千住→日暮里」と入力する場合もあれば、「北千住から日暮里」や「北千住>日暮里」と入力する人もいます。 ただ、今回のAさんやBさんは同じ入力する方法をとっているので、正規表現よりからは検索などで出来ないものでしょうか? よろしくお願いします。

a-kuma3さんのコメント
'北千住→日暮里' と '日暮里→上野' が経路として続いているということは地点の区切りが分からないと判定できません。 前と次の一部が同じなら、という判定ではダメです。 '北千住→西日暮里' に続いて '日暮里→上野' ときたらどうします? 地点の区切りが「→」だけではなく何種類かある、ということならなんとかなるとおもいますが

a-kuma3さんのコメント
>> 地点の区切りが「→」だけではなく何種類かある、ということならなんとかなるとおもいますが << プログラムを組むうえで重要なのは、こんなところかな、と。 - 「Aさんの通学」のときの地点の区切りは統一されているか(Aさんなら「→」、Bさんなら「から」に統一されているか) - ある経路について区切りは統一されているか(「上野→秋葉原」なら「→」と決まっているか) - 最終的な経路の表示で地点の区切り文字にこだわりがあるか(「→」に統一しても良いか) 多分、「通学路」というのは、質問をする際のメタファーかと思いますが、自由度がどこまであるかがよく分かりません。

牛乳先生(tukihatu)さんのコメント
>| 社内のスタッフが出発地と到着地をフリーテキストで入力するのですが、「北千住→日暮里」と入力する場合もあれば、「北千住から日暮里」や「北千住>日暮里」と入力する人もいます。 |< さすがにこれはプログラム側で吸い切れない話になりますね。 とりあえず社内ルールで区切り文字をどうするのかしっかり決めて、 今あるデータをすべて「→」に書き換える必要があります。 膨大すぎて時間がかかるという状況かも知れませんが、プログラムで対応するとその時間の5倍の労力が必要になると思いますので、一つずつ整理していったほうが最終的にはいいと思いますよ…他のプログラムで使うときにデータとして扱いやすいですし… 整理されていない名刺という感じ?

webtomakeさんのコメント
ご返答ありがとうございます。 そうですか、プログラム側では出来なそうですか.... ご回答ありがとうございます。

a-kuma3さんのコメント
>> そうですか、プログラム側では出来なそうですか.... << これは、牛乳先生向けのコメントですかね。 ひとつに決める必要はありませんが、いくつのバリエーションがあるかの決めは必要です。 >> 地点の区切りは、「→」、「から」、「>」です。 << は、何とかなりますが、 >> 地点の区切りは、「→」、「から」、「>」<span style="color:red;">など</span>です。 << は、とてつもなくハードルが高くなります。 「など」をプログラムに類推させるということですから、日本語を解釈させる、レベルのところまで一足飛びにハードルが高くなります。 それでも区切りが決められないということであれば、逆に地点の方を辞書引きにするという手はあります。 地点の候補に入らないものは、全て地点の区切りと考える方法です。 先に挙げた、「日暮里」と「西日暮里」のような部分重複がある場合、「西」の文字は区切りと見なせなくなります。 極端な例ですが、ひらがなの「から」が含まれる駅名があると「から」が区切りとして判別できない場合が出てくるということです。 >> そうですか、プログラム側では出来なそうですか.... << 繰り返しの引用ですが、正確に言うと「前提となる決め事があいまいなので、提示された条件の範囲では、プログラムで処理をするには難しい」ということになります。
関連質問

●質問をもっと探す●



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