我试图在PHP中创建一个与字符串匹配的函数,让我们说" 1234567"尽管有多个匹配,但最好的匹配前缀,选择最佳。
例如,如果我们拥有所有这些:
temp = &str[i];
输出应为=" 1234"
因为匹配最佳的前缀(尽管1,12和123匹配也不比1234好,尽管234567是最佳匹配,但不是前缀)。
我不知道这个功能是否默认以PHP语言
实现答案 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
答案 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);