在逗号分隔的单词(haystack)数组中搜索字符串(needle)

时间:2017-08-07 15:13:59

标签: php arrays regex

我知道这似乎是一个疯狂的问题,但我无法找到以下情况的最佳解决方案。

我有一系列'类别'并且每个人都有一串搜索'。这些搜索是一串逗号分隔的单词,用作strpos以匹配类别。

类别数组的示例

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

这是问题所在。说我有secret这个词。如您所见,$categories中的第一个数组searches在字符串中包含cre。我遇到的问题是给出一个字符串(在这个例子中是秘密')的方法是基于给定的字符串,在搜索中用逗号分隔的单词之一中有一个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 个答案:

答案 0 :(得分: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';
}

我实际上没有对此进行测试,但我认为这应该会让你走上正轨。

答案 1 :(得分: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);

您可以选择传递第3个参数作为searches

中单词之间的分隔符

答案 2 :(得分: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';
}

我的函数获取带有global类别的数组,如果需要,可以将它包含在函数本身中,同样的事情。 它遍历数组,然后通过当前['searches']的爆炸,并尝试在作为参数传递的单词中找到当前的单词,如果成功,则返回相应类别的名称。如果函数尝试每一个字符串没有成功,'其他'而是返回。

答案 3 :(得分: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