【问题标题】:Searching for string (needle) in an array of comma separated words (haystack) [closed]在逗号分隔的单词数组(干草堆)中搜索字符串(针)[关闭]
【发布时间】:2017-08-07 15:13:58
【问题描述】:

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

我有一个“类别”数组,每个类别都有一个“搜索”字符串。这些搜索是一串逗号分隔的单词,用作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

【问题讨论】:

  • 您应该尝试自己编写代码。在doing more research 之后,如果您有问题发布您尝试过的方法,并清楚地解释什么不起作用,并提供a Minimal, Complete, and Verifiable example。阅读How to Ask 一个好问题。请务必take the tour 并阅读this
  • 问题有点笼统,你自己还没试过吗?
  • 最好我能想到 id 循环遍历所有类别和每个类别中的搜索,然后将每个搜索视为正则表达式模式并将其与原始字符串匹配。如果有匹配项,请分配类别。
  • 从你的问题来看,你有办法。你只需要为它编写代码。一旦您在尝试编写代码时遇到实际问题,请联系我们。

标签: php arrays regex


【解决方案1】:

我不确定 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';
}

我还没有实际测试过,但我认为这应该能让你走上正轨。

【讨论】:

  • 如果你迎合“为我做这件事,人群”,他们就会不断回来争取更多
  • @RiggsFolly 如果人们想提供帮助,请让他们提供帮助。超过 90% 的时间都是我自己解决问题,但我一整天都在与这个问题作斗争。我想要一个起点。善良..
  • @RiggsFolly 可能,但如果我帮助某人找到他们的解决方案,那么我不在乎。不过,出于教育目的,我可能应该对它进行更多评论。
  • 但是 SO 社区关心。他们想要关于编程问题的高质量可搜索问题,同时也有高质量的答案。
  • 正如您从我的个人资料中看到的那样,我是在这里回答问题的新手,因此我将努力在未来提供更多评论并提供更高质量的答案。虽然,你最初的批评是我只是告诉那个人怎么做而不是让他自己做,我不明白不完全回答他的问题会如何有助于创造“高质量的可搜索问题”,也许你可以给我一些指导?
【解决方案2】:

如果我正确理解了您的问题,那么此功能应该可以帮助您。

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);

您可以选择传递第三个参数作为searches 中单词之间的分隔符

【讨论】:

  • 你应该让 OP 在写答案之前尝试一下,不是吗?
  • @ksjohn 在另一篇阅读中,我认为这实际上对 OP 没有任何帮助。但无论哪种方式,我总是对我的答案进行大量评论,以便他们可以帮助 OP 学习如何做到这一点
  • 你是对的,它没有,但方法会类似
  • @GrumpyCrouton 我自己又读了一遍,我猜你是对的
【解决方案3】:
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'] 并尝试在作为参数传递的单词中找到当前单词,如果成功则返回相应类别的名称。如果函数尝试每一段字符串都没有成功,则返回 'Other'。

【讨论】:

  • 该死,当我看到 OP 在显示更多代码之前似乎没有尝试解决她/他的问题时,我删除了,但这看起来像是一场徒劳的战斗。我还不如取消删除它...
【解决方案4】:

试试这个功能:

<?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

【讨论】:

  • 如果你迎合“为我做这件事,人群”,他们就会不断回来争取更多
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多