• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ある文字を含む文字列のみ配列にする方法)

ある文字を含む文字列のみ配列にする方法

このQ&Aのポイント
  • 変数 $text に格納されている文字列の中から、配列 $key に含まれる文字列のみを新しい配列に格納したいです。
  • 現在のコードでは、foreach ループと in_array 関数を使用していますが、うまく動作していません。
  • 正しい結果を得るためには、配列の要素ごとに文字列を比較し、含まれているかどうかを確認する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

まず、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)

noname#244856
noname#244856
回答No.3

一つ気になったのですが >> 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;   } } として、ループ前に結果の配列を初期化しておく必要があります。

azu200
質問者

お礼

ありがとうございます。php.iniに設定させていただきます。

すると、全ての回答が全文表示されます。
noname#244856
noname#244856
回答No.2

素直に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) となるので多分後者の方が速いはずですが、現実的な配列サイズならば全く差が無いと思うのでお好きな方でどうぞ。

azu200
質問者

お礼

分かりやすく説明していただきありがとうございました。 とても勉強になりました。

すると、全ての回答が全文表示されます。

専門家に質問してみよう