【问题标题】:Searching for consecutive values in an array搜索数组中的连续值
【发布时间】:2011-09-12 03:37:36
【问题描述】:

在数组中搜索连续值的最佳方法是什么?

例如,在array('x', 'a', 'b', 'c') 中搜索array('a', 'b') 将得到1,因为这些值首先在该索引处连续出现。

【问题讨论】:

  • 是否有重复值?
  • 两个数组中都没有重复值

标签: php arrays


【解决方案1】:

尚未对此进行测试,但应该这样做:

function consecutive_values(array $needle, array $haystack) {
    $i_max = count($haystack)-count($needle);
    $j_max = count($needle);
    for($i=0; $i<$i_max; ++$i) {
        $match = true;
        for($j=0; $j<$j_max; ++$j) {
            if($needle[$j]!=$haystack[$i+$j]) {
                $match = false;
                break;
            }
        }
        if($match) {
            return $i;
        }
    }
    return -1;
}

【讨论】:

  • 这比我的方法好。经测试。工作。
【解决方案2】:

这可能不是最理想的,但相当简洁:

$needle = array('a', 'b');
$haystack = array('x', 'a', 'b', 'c');

function searchInArray($haystack, $needle)
{
    $keys = array_search($haystack, $needle[0]);

    foreach ($keys as $key) {
        $endPos = $key + count($needle);   
        for ($i=1; $i<$count($needle); $i++) {
            if ($needle[$i] == $haystack[$key + $i]) {
                return $key;
            }
        }
    }
    return false;
}

【讨论】:

  • 您将在第一场比赛中回归......他们所有都需要匹配。
【解决方案3】:

这可以满足您的要求,它有点具体,因为所有数组都必须是非键控的,并且具有唯一的值。

此外,在此版本中,数组只能包含整数或字符串值。如果你还需要任何 NULL、object、float 和数组,需要将其中的一部分从 array_flip() + isset() 更改为 array_search()

CodePad/Gist

相关部分是将您搜索的数组切片(此处为$in)与您搜索的数组(此处为$for)进行比较:

array_slice($in, $pos, $len) === $for

$pos 之前已经查找过$for 的第一个值,$lencount($for)

【讨论】:

  • 请在您的答案中发布您的代码的相关部分(除了演示链接之外)。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多