PHP短文本匹配的排序算法

http://3v4l.org/K0X7m


<?php
/** 初始化设置查询关键词和查询内容 **/
$names = array(
  '真三国无双',
  '无双剑姬',
  '虚无',
  '一时无两',
  '南无阿弥陀佛',
  '崖山之后无中国',
);
$search = array("无","双");

/** 劈开字符串 **/
$res = array();
foreach($names as $name) {
	preg_match_all("/./u", $name, $match);
	$res[$name]['single'] = $match[0];
}

/** 对字符串进行遍历,存储匹配到的位置,对没有匹配到所有的关键词的字符串剔除,匹配到所有的将位置相加,越小的排名越靠前 **/
foreach($res as $name => $v) {
	$pos = array();
	foreach($v['single'] as $k => $s) {
		if(in_array($s, $search)) $pos[$s][] = $k;
	}
	if(count($pos) != count($search)) {
		unset($res[$name]);
	} else {
		$seq = 0;
		array_walk_recursive($pos, function($i) use(&$seq) {
			$seq += $i;
		});
		$res[$name] = $seq;
	}
}

ksort($res);
$res = array_keys($res);

var_dump($res);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值