こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

var_dump($text);
を行うと
array(1) { [0]=> string(XX) "あいさつ" }
array(1) { [0]=> string(XX) "いい日旅立ち" }
array(1) { [0]=> string(XX) "りんご、うまい" }
array(1) { [0]=> string(XX) "メロン好き" }
……
となるような変数 $text があり、そこから

$key = array("ばなな","りんご","メロン");

の配列内にある文字列を含むものだけを新たに格納したいです。

自分では

foreach($text as $value){
if(in_array($value, $key)){
$key_text[] = $value;
}
}

と書いて試したのですが、NULLと返ってきてしまいます。
どうやって書けばいいか教えて下さい。
よろしくお願いします。

投稿日時 - 2013-11-26 15:06:28

QNo.8362694

すぐに回答ほしいです

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

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

投稿日時 - 2013-11-26 17:03:10

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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;
  }
}

として、ループ前に結果の配列を初期化しておく必要があります。

投稿日時 - 2013-11-27 02:06:13

お礼

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

投稿日時 - 2013-12-02 13:22:10

ANo.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)

となるので多分後者の方が速いはずですが、現実的な配列サイズならば全く差が無いと思うのでお好きな方でどうぞ。

投稿日時 - 2013-11-27 01:47:35

お礼

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

投稿日時 - 2013-12-02 13:25:47

あなたにオススメの質問