2017-08-07 13 views
-1

これは狂った質問のようですが、私は次のような状況では最高の解決策を見つけられません。コンマで区切られた単語(haystack)の配列で文字列(針)を検索しています

私は 'categories'の配列を持っており、それぞれに 'searches'という文字列があります。これらの検索は、カンマで区切られた単語の文字列で、カテゴリに一致するようにstrposとして機能します。ここでは、カテゴリ配列

$categories = [ 
    0 => [ 
    'category' => 'Foo', 
    'searches' => 'fet,cre,oho' 
    ], 
    1 => [ 
    'category' => 'Bar', 
    'searches' => 'lois,vreb,mon' 
    ], 
] 

例は問題です。私はsecretという単語があるとします。ご覧のとおり、$categoriesの最初の配列はsearchesで、文字列にはcreが含まれています。私が抱えている問題は、検索のコンマで区切られた単語の1つにstrpos()という文字列に基づいたカテゴリを文字列(この例では '秘密')に指定してからカテゴリを返すアプローチですネコ)。私が探しています

結果:私が正しくあなたの質問を理解している場合

function findCategory($string) 
{ 
    $category = false; 

    // code to take the string, 
    // look through $categories 
    // find the first occurrence of a string position 
    // in the comma separated list of possible matches 

    return $category ? $category : 'Other'; 
} 

echo findCategory('secret'); // Foo 
echo findCategory('monster'); // Bar 
echo findCategory('cohort'); // Foo 
echo findCategory('tense'); // Other 
+4

**自分でコードを書き込もうとしています**。あなたが問題を抱えている場合は** [もっと研究している**](https://meta.stackoverflow.com/q/261592/1011527)の後**あなたが試したものを投稿してください** **動作しておらず、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供しています。 [質問する](http://stackoverflow.com/help/how-to-ask)の良い質問をお読みください。 [ツアーに参加する](http://stackoverflow.com/tour)と[this](https://meta.stackoverflow.com/q/347937/1011527)を必ずお読みください。 –

+0

質問は少しブロードですが、あなたはまだ何も試してみませんか? – RiggsFolly

+0

私は各カテゴリのすべてのカテゴリと検索を通してidループを考えることができます。次に、各検索を正規表現パターンとして扱い、元の文字列と照合します。一致するものがあればカテゴリを割り当てます。 – SchoolBoy

答えて

2

私はGrumpyCrutonの答えは非常に完全な一致がない必要になりますin_array()メソッドとして動作するように起こっているか分かりませんあなたが必要とする部分的な一致。おそらく、次のようなものはあなたのために動作します:

function findCategory($needle, $categories) { 
    foreach($categories as $category){ 
    $searches = explode($delimiter, $category['searches']); 
    foreach ($searches as $search){ 
     if(strpos($needle, $search) !== false){ 
     return $category['category']; 
     } 
    } 
    } 
    return 'Other'; 
} 

私は実際にこれをテストしていませんが、私はそれが正しい軌道に乗ってあなたを得るべきだと思います。

+0

あなたは "私のためにそれを行う、群衆"もっと – RiggsFolly

+0

@RiggsFolly人々が助けてくれるのを手助けしたいと思ったら。時間の90%以上は自分自身で解決することに転向しますが、私はこれで一日中戦っています。私は出発点を求めた。善良です。 –

+0

@RiggsFollyおそらく、もし私が誰かが解決策を手伝ってもらえれば、私は気にしません。しかし、私はおそらく教育的な目的のためにそれをコメントしたはずです。 –

1

、この関数はあなたを助ける必要があります。

function findCategory($needle, $categories, $delim = ",") { 
    //loop through every category 
    foreach($categories as $category) { 
     //split searches string into an array of strings 
     $searches = explode($delim, $category['searches']); 
     //if needle exists in array of strings, return category. 
     if(in_array($needle, $searches)) return $category['category']; 
    } 
} 

ユースケース:

findCategory($needle, $categories); 

必要に応じて、あなたは私の関数がglobalとカテゴリを持つ配列を取得searches

+1

答えを書く前にOPに試してもらうべきでしょうか? – ksjohn

+0

@ksjohnもう一度読んで、私はこれが実際にOPに役立つとは思わない。しかしどちらの方法でも、私はいつも私の答えを大きくコメントして、OPのやり方を学ぶのを助けることができます – GrumpyCrouton

+0

あなたは正しいですが、アプローチは似ています – SchoolBoy

0
function findCategory($word) { 
    global $categories; 
    foreach ($array as $key => $val) { 
     $subarray = explode(',', $val['searches']); 
     foreach ($subarray as $str) { 
      if (strpos($word, $str) !== false) { 
       return ($val['category']); 
      } 
     } 
    } 
    return 'Other'; 
} 

に単語間の区切り文字として3番目のparamを渡すことができます同じことを望むなら、関数自体に含めることができます。 配列を反復し、現在の['searches']を展開し、引数として渡す単語の現在の単語を見つけようとします。成功した場合は、対応するカテゴリの名前を返します。関数が文字列のすべての部分を正常に実行しようとすると、代わりに「その他」が返されます。

+0

Dammit、私は、OPがもっと多くのコードが表示されるまで、彼/彼女の問題を解決しようとしていないように見えたのを削除しましたが、無駄な戦いのように見えます。私はそれを元に戻すかもしれません... – ksjohn

0

この機能を試してみてください:

<?php 

$categories = [ 
    ['category' => 'Foo', 'searches' => 'fet,cre,oho'], 
    ['category' => 'Bar', 'searches' => 'lois,vreb,mon'], 
]; 

function findCategory($string, $categories) 
{ 
    foreach($categories as $category) { 
     foreach(explode(',', $category['searches']) as $search) { 
      if (false !== strpos($string, $search)) { 
       return $category['category']; 
      } 
     } 
    } 

    return 'Other'; 
} 

echo findCategory('secret', $categories) . '<br>'; 
echo findCategory('monster', $categories) . '<br>'; 
echo findCategory('cohort', $categories) . '<br>'; 
echo findCategory('tense', $categories) . '<br>'; 

出力:

Foo 
Bar 
Foo 
Other 
+0

"私のためにそれを行う、群衆"彼らはちょうど戻って来てくださいmore – RiggsFolly

関連する問題