- ベストアンサー
ある文字を含む文字列のみ配列にする方法
- 変数 $text に格納されている文字列の中から、配列 $key に含まれる文字列のみを新しい配列に格納したいです。
- 現在のコードでは、foreach ループと in_array 関数を使用していますが、うまく動作していません。
- 正しい結果を得るためには、配列の要素ごとに文字列を比較し、含まれているかどうかを確認する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、foreach($text as $value)で得られる$valueはこの場合要素を1つだけもつ 配列データなのでin_arrayで比較することはできません またかりに$valueが文字列だったとしてもin_arrayは完全一致なのでマッチしません こんなかんじでどうですか? <pre> <?PHP $text=array( array( "あいさつ") ,array("いい日旅立ち" ) ,array("りんご、うまい") ,array("メロン好き" ) ); var_dump($text); $key = array("ばなな","りんご","メロン"); $pattern=""; foreach($key as $val){ if($pattern!=="") $pattern.="|"; $pattern.=preg_quote($val); } $pattern="/".$pattern."/"; foreach($text as $value){ if(preg_match($pattern,$value[0])){ $key_text[] = $value[0]; } } var_dump($key_text); ?> </pre>
その他の回答 (2)
一つ気になったのですが >> NULLと返ってきてしまいます。 のように「エラーが発生してNULLになった」と述べられていないということは、E_NOTICEの表示をされていませんね?これだと変数名のタイピングミスをしてしまったときなどに非常にミスに気づきにくくなるので、全てのエラーを表示させるようにphp.iniの設定で error_reporting = E_ALL | E_STRICT display_errors = On としましょう。ループが一周もしない可能性がある場合、つまり回される配列が空になる可能性がある場合は $key_text = array(); foreach ($text as $value) { if (in_array($value, $key)) { $key_text[] = $value; } } として、ループ前に結果の配列を初期化しておく必要があります。
素直にstrposで検索するならこれでどうでしょうか。 http://ideone.com/S5DNRg <?php $text = array( array('あいさつ'), array('いい日旅立ち'), array('りんご、うまい'), array('メロン好き'), ); $key = array('ばなな', 'りんご', 'メロン'); $key_text = array(); foreach ($text as $v1) { foreach ($key as $v2) { if (strpos($v1[0], $v2) !== false) { $key_text[] = $v1[0]; } } } var_dump($key_text); なお、PHP言語レベルでのループ回数を考えると 私の方法は O(nm) yambejpさんの方法は O(n+m) となるので多分後者の方が速いはずですが、現実的な配列サイズならば全く差が無いと思うのでお好きな方でどうぞ。
お礼
分かりやすく説明していただきありがとうございました。 とても勉強になりました。
お礼
ありがとうございます。php.iniに設定させていただきます。