2011-06-10 83 views
1

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

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

+0

有没有重复的值? – hakre 2011-06-10 01:27:41

+0

这两个数组中都没有重复的值 – babonk 2011-06-10 01:49:15

回答

0

没有测试过这一点,但这样的事情应该做的:

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; 
} 
+0

这比我的方法要好。测试。作品。 – Nemoden 2011-06-10 01:07:18

0

这可能是次优的,但相当简洁:

$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; 
} 
+0

你在第一场比赛中返回......他们*全部*需要匹配。 – mpen 2011-06-10 05:20:42

0

这确实你问什么,因为所有数组都必须是非键控的,并且具有唯一值,所以它具有一定的特定性。

此外,在此版本中,数组只能包含整数或字符串值。如果您还需要任何NULL,对象,浮点数组和数组,它的一部分需要从array_flip() + isset()更改为array_search()

CodePad/Gist

相关部分是比较您搜索的(这里$in)的阵列与阵列的你搜索(这里$for)切片:

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

$pos一直第一个值为$for,$len的值为count($for)

+0

请将您代码的相关部分发布在您的答案中(除了链接到演示)。 – 2011-06-10 02:51:30