【问题标题】:match at least 5 number position at same place in given mobile number在给定手机号码的同一位置匹配至少 5 个号码位置
【发布时间】:2016-03-03 13:08:12
【问题描述】:

鉴于我有以下电话号码:

  • 9904773779

我想在我的数据库中搜索与上述号码至少有 5 位相同的其他电话号码,例如:

  • 9933723989
  • 9403793378

我的第一个方法是使用这样的查询:

select mobileno from tbl_registration where mobileno like '%MyTextBox Value%'

但是,这不起作用。

【问题讨论】:

  • 我尝试过使用 mysql,例如“从 tbl_registration 中选择 mobileno,其中 mobileno 像 '%MyTextBox Value%'”
  • 这听起来像你想做一些与计算levenshtein distance 非常相似的事情。这是你想要的吗?需要注意的是标准库中的PHPhas a function to calculate this
  • 我不知道 Levenshtein 距离我认为我的问题很容易理解
  • 您在寻找什么样的解决方案,PHP 解决方案还是 MySQL 解决方案?
  • 恕我直言正则表达式不是一个可行的解决方案。我也无法想象一个纯粹的 MySQL 解决方案,但我很惊讶。我会选择纯 PHP 解决方案:创建一个比较两个字符串的函数,一个比较每个数字并保留一个小计数器的简单循环。

标签: php mysql regex


【解决方案1】:

我认为这里更简洁的 PHP 解决方案是使用 similar_text:

这会计算两个字符串之间的相似度。

示例演示:

$numbers = array("1234567890", "9933723989", "9403793378");
$key = "9904773779";
foreach ($numbers as $k) {           
  if (similar_text($key, $k) >= 5) { // There must be 5+ similarities
    echo $k . PHP_EOL;  
  }
}

输出:[ 9933723989, 9403793378]

IDEONE demo

【讨论】:

  • similar_text 绝对是它。我将similar_text 与我的示例和levenshtein 进行了比较,它绝对是最快的。 ideone.com/hczC6T
  • echo similar_text("123456", "712345"); = 5 -- 我认为 OP 希望匹配的数字在 same 列中。
【解决方案2】:

我想我会使用 PHP,虽然不是很整洁,可能有更好的方法。

<?php
$strOne = '9904773779';
$strTwo = '9933723989';
$arrOne = str_split($strOne);
$arrTwo = str_split($strTwo);
$arrIntersection = array_intersect($arrOne,$arrTwo);
$count=0;
foreach ($arrIntersection as $key => $value) {
  if ($arrOne[$key] === $arrTwo[$key]) {
    $count++;
  }
}
print_r($count);
?>

在第一阶段,我将字符串拆分为数组。然后我使用 array_intersect 来识别重复值并将它们保存到一个数组中。这样就不必遍历每个数字。然后我循环遍历相同值的数组并比较两个数组以查看值是否相同。

不过,我确实期待一个更酷的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多