【问题标题】:Is there any PHP function to solve out array value matches in another array value string?是否有任何 PHP 函数可以解决另一个数组值字符串中的数组值匹配问题?
【发布时间】:2019-09-07 01:54:16
【问题描述】:

我正在创建一个单词搜索,但我想根据搜索关键字的最高存在对它们进行排名。我怎么解决这个问题?

我正在尝试搜索数组 1 键是否存在于数组 2 长字符串中,然后按数组 2 中数组 1 的总出现次数对数组进行排序。

Blow 是我的代码

$str = "Hello World January Jude";
$arr1 = ["Hello World January Jude Lol Love","Hello Lol Loop","Love Life Jude","Crude Flash Hello"];
$str = explode(" ", $str);
echo sort_base($arr1, $str);
function sort_base($arr, $str){
$count = "";
foreach ($arr as $valuer){
    foreach ($str as $value){
    //$list[] = strpos($valuer, $value, 0);
    $count .= strpos($valuer, $value, 0)."<hr/>"; 
}

}
$arr = trim($count," ");
 echo $arr;
}

输入示例:

$array = ["Say Hello","Hello World"," Hello World Cup Final","Hello Cup","Hello","World"]; 
$str = "Hello World Cup"; 

愿望输出

按顺序排列:

  1. 你好世界杯
  2. 最终的 Hello World
  3. 你好杯
  4. 你好
  5. 世界
  6. 打个招呼

【问题讨论】:

  • 您好,您能否更详细地解释一下该函数的输出与您尝试获得的输出有何不同?预期和实际输出的示例会很有帮助。
  • 好的,我会放在这里例如我正在搜索“Hello World Cup”,它是 $str 作为变量,我有数组,例如 $array = ["Say Hello" ,"Hello World","Hello World Cup Final","Hello Cup","Hello","World"];所以我想使用 $str = explode(" ",$array )。
  • 例如 $array = ["Say Hello","Hello World","Hello World Cup Final","Hello Cup","Hello","World"]; $str = "你好世界杯";所以如果我这样调用函数 $arrays = sort_most_exists_asc($str, $array);它应该重新排序我的数组,所以我的数组应该排序到 Hello World Cup Final Hello World Hello Cup Hello World Say Hello
  • 例如 $array = ["Say Hello","Hello World","Hello World Cup Final","Hello Cup","Hello","World"]; $str = "你好世界杯";所以如果我这样调用函数 $arrays = sort_most_exists_asc($str, $array);它应该重新排序我的数组,所以我的数组应该排序为 1. Hello World Cup 2. Final Hello World 3. Hello Cup 4. Hello 5. World 6. Say Hello Re Arranged 基于总索引数组并返回为数组以供使用.

标签: php arrays sorting search


【解决方案1】:

您可以使用array-intersectcount来实现相似词的数值。现在您可以使用usort 进行排序。

考虑以下几点:

function sort_most_exists_asc($arr, $str) {
    usort($arr, function ($a, $b) use ($str) {
        $aa = count(array_intersect(explode(" ", $str), explode(" ", $a)));
        $bb = count(array_intersect(explode(" ", $str), explode(" ", $b)));
        return $bb - $aa;
    });
    return $arr;
}

$str = "Hello World January Jude";
$arr = ["Hello World January Jude Lol Love","Hello Lol Loop","Love Life Jude","Crude Flash Hello"];
$arr = sort_most_exists_asc($arr, $str);

现场示例:3v4l

请注意,这仅适用于整个单词。对于单词相似度,使用Levenshtein distance - 并通过usort中的进行比较

【讨论】:

  • 谢谢!但是当它不是函数也不是变量时,我不知道如何使用它?
  • @FlashMediaTechnology 你是什么意思?什么不是函数也不是变量?我将它转换为类似的功能 - 现在更好了吗?
  • 以上代码已更正为函数 sort_most_exists_asc($array, $str) { usort($array, function ($a, $b) use ($str) { $aa = count(array_intersect(explode (" ", $str), explode(" ", $a))); $bb = count(array_intersect(explode(" ", $str), explode(" ", $b))); 返回 $bb - $aa; });返回$数组; } 现在可以正常工作了,非常感谢@dWinder
  • @FlashMediaTechnology - 如果这有帮助,您可以将其标记为已接受(答案左侧的灰色“v”)。但是,Don't_panic 的答案似乎更优雅,所以建议你也试试他的代码。并将变量名称编辑为$arr
  • 您好,这确实解决了我的问题,但不能使用多维数组 例如:$arr = array(array("title" => "Hello World", "body" => "Hi All this是我的内容"), array("title" => "Hello World Boy", "body" => "Hi All this is my content Girl"),array("title" => "Hello Kids", "body" =>“嗨,这都是我的内容孩子”)); $str = "Hello World 一月裘德"; $arr = sort_most_exists_asc($arr, $str);但似乎根本不起作用。
【解决方案2】:

您可以在每个短语和目标单词列表之间创建一组所有匹配的单词。

foreach ($arr1 as $phrase) {
    $matches[] = array_intersect(str_word_count($phrase, 1), $str);
}

该匹配数组可以与array_multisort 一起使用以重新排序原始数组。

array_multisort($matches, SORT_DESC, $arr1);

【讨论】:

  • 我的是多数组匹配
猜你喜欢
  • 2019-09-08
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多