2014-04-04 4 views
0

Я хочу найти, есть ли совпадение в массиве для 3 или более. Мой код не работает, но я не знаю, почему. Я хочу вернуть индекс из найденных.Найти 3 или более совпадений в массиве

это то, что я пробовал:

$array1 = array("bar", "bar", "bar", "foo","foo"); 
$array2 = array("foo", "bar", "bar", "bar","foo"); 
$array3 = array("foo", "bar", "bar", "bar","bar"); 


function checkForMatch($array){ 
for($i=0; $i < count($array);$i++){ 
if($array[i] == $array[i+1] && $array[i] == $array[i+2]){ 
echo "match for 3"; 
    } 
} 
} 

checkForMatch($array1); 

оно не вернуть ничего, он не работает для всех массивов.

Он должен быть рядом друг с другом, поэтому последовательное совпадение не только соответствует, если его больше в одном массиве Что я делаю неправильно?

ответ

0

Я бы рекомендовал комбинацию из array_count_values и array_filter:

<?php 
    $array1 = ["bar", "bar", "bar", "foo","foo"]; 

    $statistics = array_count_values($array1); 
    $array1 = array_filter($array1, function($el) use ($statistics) { 
     return $statistics[$el] > 2; 
    }); 

    var_dump($array1); 
+0

это может быть сделано без фильтра массива? просто простая кодировка? он не распознает функции – MichaelAngelo

+0

Да, это можно сделать, см. комментарий @AbcAeffchen. Я использовал синтаксис синтаксиса квадратной скобки php 5.4, если у вас есть более старая версия php, она будет терпеть неудачу (поэтому просто используйте array() вместо []) – Misiur

0

Проблемы с кодом, что вы бежите из границ массива с $i < count($array) и [$i+2]

Просто используйте $i < count($array)-2

EDIT: Вы пропустите $ в петле

+0

та же проблема m8 (ничего не возвращает), но хороший ее не видел – MichaelAngelo

+0

Вы также пропустите каждый в цикле '$' – AbcAeffchen

0
<?php 
$array1 = array("bar", "bar", "bar", "foo", "foo"); 
$array2 = array("foo", "bar", "bar", "bar", "foo"); 
$array3 = array("foo", "bar", "bar", "bar", "bar"); 
function checkForMatch($array) 
{ 
    for ($i = 0; $i < count($array) - 2; $i++) 
    { 
     if ($array[$i] == $array[$i + 1] && $array[$i] == $array[$i + 2]) 
     { 
      echo '"' . $array[$i] . '" is equal or more than 3 times'; 
      break; 
     } 
    } 
} 
checkForMatch($array1); 
?> 
+0

, если вы добавите $ array4 = array ("foo", "bar", "foo", "bar", "foo"); он признает это также как матч – MichaelAngelo

+0

вы хотите 3 матча? или 3 последовательных матча? – dikesh

+0

он должен быть рядом друг с другом ... так последовательно – MichaelAngelo

0

Покажет все дубликаты, где отсчет более 3

function checkForMatch($aArray, $iMatch = 3) 
{ 
    $aCount = array_count_values($aArray); 

    foreach ($aCount as $sKey => $sCount) { 
     if ($sCount >= $iMatch) { 
      // return/do everything you need, array with duplicates found 
      echo $sKey . ' >= ' . $iMatch; 
     } 
    } 
} 

$aTest = array("bar", "bar", "bar", "foo", "foo"); 
checkForMatch($aTest); 
Смежные вопросы