Поиск последовательных значений в массиве

#php #arrays

#php #массивы

Вопрос:

Каков наилучший способ поиска последовательных значений в массиве?

Например, поиск array('a', 'b') в array('x', 'a', 'b', 'c') дал бы результат 1 , потому что значения сначала отображаются последовательно по этому индексу.

Комментарии:

1. существуют ли повторяющиеся значения или нет?

2. ни в одном из массивов нет повторяющихся значений

Ответ №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;
}
  

Комментарии:

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

Комментарии:

1. вы возвращаетесь после первого совпадения… все они должны совпадать.

Ответ №3:

Это делает то, о чем вы просите, это несколько специфично, поскольку все массивы должны быть без ключа и иметь уникальные значения.

Кроме того, в этой версии массивы могут содержать только целочисленные или строковые значения. Если вам также нужны какие-либо NULL, object, float и массивы, часть из них необходимо изменить с array_flip() isset() на array_search() .

CodePad / Суть

Важной частью является сравнение фрагмента массива, в котором вы выполняете поиск (здесь $in ), с массивом, который вы ищете (здесь $for ):

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

$pos ранее был произведен поиск первого значения $for , $len is count($for) .

Комментарии:

1. Пожалуйста, опубликуйте соответствующую часть вашего кода в вашем ответе (в дополнение к ссылке на демо).