@Allarion

Проверка корректности последовательности в массивах на php?

Есть два массива 1 - одномерный массив правильность последовательности элементов в котором нужно проверить и 2 - одномерный массив трафарет в котором указана корректная последовательность элементов. Было бы легко решить этот вопрос, если бы количество элементов равнялось друг другу, но в массиве 1 могут быть не все значения из массива 2, а только часть.

Для примера можно взять массивы:

$ar = array(
   [0] => FIRST
   [1] => SECOND
   [2] => FIFTH
   [3] => SEVENTH
   [4] => EIGHTH
)

$pattern = array(
  [0] => FIRST
  [1] => SECOND
  [2] => THIRD
  [3] => FOURTH
  [4] => FIFTH
  [5] => SIXTH
  [6] => SEVENTH
  [7] => EIGHTH
  [8] => NINTH
  [9] => TENTH
)

$arFail = array(
   [0] => EIGHTH
   [1] => SEVENTH
   [2] => FOURTH
   [3] => SECOND
   [4] => FIRST
)

Как можно проверить, что последовательность значений в ar соответствует $pattern, а порядок значений $arFail не соответствует $pattern?
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
Stalker_RED
@Stalker_RED
Как-то так:
function myCheck($arr, $pattern) {
  $lastPos = -1;
  foreach($arr as $value) { // перебираем массив
    $pos = array_search($value, $pattern); // ищем текущий элемент в pattern
    if ($pos !== false && $pos > $lastPos) { // если он найден, и позиция больше чем у предыдущего - все норм.
      $lastPos = $pos;
    } else return false; // если нет - не норм.
  }
  return true;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
egor_nullptr
@egor_nullptr
function check(array $p, array $a)
{
    $stack = new SplStack();
    foreach (array_reverse($a) as $i) {
        $stack->push($i);
    }

    $top = $stack->pop();
    foreach ($p as $i) {
        if ($i == $top) {
            if ($stack->isEmpty()) {
                return true;
            }
            $top = $stack->pop();
        }
    }

    return $stack->isEmpty();
}

assert(check($pattern, $ar));
assert(!check($pattern, $arFail));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 16:26
3000 руб./за проект
03 мая 2024, в 16:09
1200 руб./за проект
03 мая 2024, в 16:06
3000 руб./за проект