PHP模式匹配从更精确到更少的数组

时间:2015-10-22 17:24:09

标签: php

我试图在PHP中创建一个与字符串匹配的函数,让我们说" 1234567"尽管有多个匹配,但最好的匹配前缀,选择最佳。

例如,如果我们拥有所有这些:

temp = &str[i];

输出应为=" 1234"

因为匹配最佳的前缀(尽管1,12和123匹配也不比1234好,尽管234567是最佳匹配,但不是前缀)。

我不知道这个功能是否默认以PHP语言

实现

4 个答案:

答案 0 :(得分:3)

按长度从最长到最短排序前缀。然后返回第一场比赛。

skip

如果您需要使用相同的前缀列表多次执行此操作,您可能需要对列表进行一次排序,然后执行true循环以防止多次排序。

答案 1 :(得分:2)

PHP确实有similar function,但不完全相同......

有很多方法可以实现你想要的,当然,这就是我要做的事情:

function get_best_prefix($input, array $prefixes)
{
        // Walk through all the possible prefixes and eliminate 
        // the non-matching ones by setting them to null
        array_walk(
                $prefixes,
                function(&$value, $key, $input)
                {

                        if (strncmp($input, $value, strlen($value)) !== 0)
                        {
                                $value = null;
                        }
                },
                $input
        );

        // Not really necessary, but let's eliminate duplicate elements
        $prefixes = array_unique($prefixes, SORT_STRING);

        // Sort the remaining prefixes (all valid ones at this point)
        // by length, putting the highest-length ones at the top 
        usort(
                $prefixes,
                function($a, $b)
                {
                        return (strlen($a) > strlen($b)) ? -1 : 1;
                }
        );

        // Get the first element of the array, which is now the 
        // longest possible prefix that we have. There's the 
        // possibility of the array being empty or containing 
        // only a single null value, but that's OK - null would 
        // be returned in both cases.
        return array_shift($prefixes);
}

答案 2 :(得分:1)

迭代所有可能的匹配并将它们保存到新数组中。您可以使用strpos检查您的子字符串是否是输入的前缀。您可以根据它们的使用时间来订购它们。

$input = '1234567';
$array = ['1', '12', '123', '1234', '456', '56', '7', '3456', '234567'];

$results = [];
foreach ($array as $data) {
    if (strpos($input, $data) === 0) {
        $results[strlen($data)][] = $data;
    }
}

krsort($results);

// best results - you can use foreach to scroll them all
var_dump($results);

// pick the best result
echo current($results)[0]; // 1234

Demo

答案 3 :(得分:1)

如果你只是想要最好的,那么就没有必要知道他们的匹配。

/**
 *
 * @param string $input
 * @param array $array
 * @param int $limit [Optional, limit of iterations before giveup. Default -1 ( no limit ).]
 * @param int $count [Optional, If specified, this variable will be filled with the number of replacements done.] 
 * @return type
 */
function get_best_prefix($input, $array, $limit = -1, &$count = null) {

  $best = '';
  $sizeBest = 0;
  $count = 0;

  foreach ($array as $data) {
    if (strpos($input, $data) === 0) {
      $current = strlen($data);

      if ($sizeBest < $current) {
        $sizeBest = $current;
        $best = $data;
      }

      $count++;
      if ($limit > -1 AND $count >= $limit) {
        break;
      }
    }
  }

  return $best;
}

$input = '1234567';
$array = ['1', '12', '123', '1234', '456', '56', '7', '3456', '234567'];
echo get_best_prefix($input, $array);