Как проверить, имеет ли массив одно значение за другим в другом массиве PHP?

У меня возникла проблема в моем проекте. Вот случай

Допустим, у меня есть два массива, array_1, array_2. array_1 имеет значение ['A', 'B', 'C', 'D', 'E', 'F'], а array_2 имеет значение ['B', 'C', 'D']. Я хочу, чтобы результат был истинным, если array_1 имеет одно и то же значение array_2 одно за другим. Для приведенного выше случая верно. Теперь, если array_2 имеет значение ['C', 'D', 'B'], тогда оно возвращается в false, потому что значения не идут одно за другим. Вот код, который я пробовал

    if (!array_diff($array_2, $array_1)) {
        return true;
    }
return false

Но это не возвращает того, что я хочу делать. заранее спасибо

Использовать уникальный массив

Ramesh S 08.01.2019 06:42

@RameshS Я не думаю, что уникальный массив может удовлетворить мою потребность

Habib Hassan 08.01.2019 06:45

Вам нужны уникальные значения из обоих массивов? Что ты хочешь?

Hiren Gohel 08.01.2019 06:45

Должны ли массивы быть одинаковой длины или их можно сравнивать с фрагментом массива при одинаковом порядке?

Joseph_J 08.01.2019 06:47

Сначала используйте array_intersect на array_1, а затем используйте это решение stackoverflow.com/questions/17353683/…

sagar patel 08.01.2019 06:47

Нет, мне не нужна уникальная ценность. Я хочу либо true / false, если в первом массиве есть элемент второго массива один после пыльника

Habib Hassan 08.01.2019 06:47

@Joseph_J Нет, два массива не имеют одинаковой длины

Habib Hassan 08.01.2019 06:48

@HabibHassan Вы можете создать свой собственный алгоритм для этого, используя базовые foreach и if else

Sohel0415 08.01.2019 07:09

@HabibHassan проверь это 3v4l.org/0EgPq

Sohel0415 08.01.2019 07:13

@HabibHassan должен ['B', 'D', 'E'] возвращать истину или ложь?

Nick 08.01.2019 07:30

@Nick ['B', 'D', 'E'] должен возвращать false

Habib Hassan 08.01.2019 07:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
11
243
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Изменить 3:

Как заметил Ник, в некоторых случаях это не сработает. Нравится $a = ['a-b', 'c']; $b = ['a', 'b'];.

Посмотрите его решение.

Это не всегда работа:

$array_1 = ['A', 'B', 'C', 'D', 'E', 'F'];
$array_2 = ['B', 'C', 'D'];

if (str_contains(implode('-', $array_1), implode('-', $array_2))) {
    return true;
}

return false;

Или просто:

return str_contains(implode('-', $array_1), implode('-', $array_2));

Я взорвал массивы (сделал из них строку и склеил их с помощью -) и проверил, является ли строка $array_2 подстрокой строки $array_1 с помощью Laravel str_contains (стог сена, иголка)

Истинный. Это не сработает. str_contains - помощник Laravel. В вопросе есть тег Laravel

DevK 08.01.2019 07:00

Лучше с добавлением клея. По-прежнему могут возникать проблемы, если в значениях есть связующий символ или если значения в $array_2 являются подстроками значений в $array_1, например. если $array_1 = ['A', 'BB', 'C', 'D', 'E', 'F']; вернет истину.

Nick 08.01.2019 07:17

Новая версия не будет работать, если например $array_1 = ['A', 'C', 'C', 'D', 'E', 'F']; и $array_2 = ['C', 'D', 'E']; :-(

Nick 08.01.2019 07:53

О Конечно. Эх я иду спать. Классная проблема, я уверен, что есть действительно хорошее решение, которое нам не хватает. Но не сегодня вечером. Не отставать, потому что я думаю, что мое оригинальное решение действительно хорошо, если вы знаете, что строки будут иметь длину всего 1 символ.

DevK 08.01.2019 08:02

Я считаю, что опубликованное мной решение (с использованием json_encode) решает эту проблему надежности, сохраняя при этом простоту, но я думаю, что OP в этом не нуждается :)

Jeto 08.01.2019 08:17

Вот функция, которая надежно проверяет, что значения в $array_2 находятся в $array_1 в том же порядке, один за другим (то есть с последовательными индексами):

function compare_arrays($array_1, $array_2) {
    $count_1 = count($array_1);
    $count_2 = count($array_2);
    for ($i = 0; $i < $count_1 - $count_2 + 1; $i++) {
        if ($array_1[$i] == $array_2[0]) {
            for ($j = 1; $j < $count_2 && $i + $j < $count_1; $j++) {
                if ($array_1[$i+$j] != $array_2[$j]) break;
            }
            if ($j == $count_2) return true;
        }
    }
    return false;
}
$array_1 = ['A', 'B', 'C', 'D', 'E', 'F'];
$array_2 = ['B', 'C', 'D'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['C', 'D', 'B'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['B', 'D', 'E'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_2 = ['A', 'B', 'C'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";
$array_1 = ['A', 'C', 'C', 'D', 'E', 'F'];
$array_2 = ['C', 'D', 'E'];
echo compare_arrays($array_1, $array_2) ? "true\n" : "false\n";

Вывод:

true 
false 
false 
true 
true

Демо на 3v4l.org

Если я что-то не пропустил, вы можете просто сделать это:

$result = strpos(
  implode(array_map('json_encode', $input1)), 
  implode(array_map('json_encode', $input2))
) !== false;

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

Демо здесь: https://3v4l.org/eAQst

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

Моя попытка просто выполняет итерацию по каждому элементу, а затем создает второй массив того же размера, что и искомый массив, а затем в конце выполняет проверку сравнения.

Код:

function checkArray($a, $b){

  $test = FALSE;

  for($i = 0; $i < count($a); $i++){

    for($j = 0; $j < count($b); $j++){

      $array[] = $a[$i + $j];

    }

    if ($array == $b){

      $test = TRUE;
      break;

    }

    unset($array);

  }

return $test;

}


$sample = ['A', 'B', 'C', 'D', 'E', 'F'];
$match = ['B', 'C', 'D'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['C', 'D', 'B'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //False
$match = ['B', 'D', 'E'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //False
$match = ['A', 'B', 'C'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['A'];
echo checkArray($sample, $match) ? "true\n" : "false\n"; //True
$match = ['F'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//True
$sample = ['A', 'C', 'C', 'D', 'E', 'F'];
$match = ['C', 'D', 'E'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//True
$sample = ['C', 'D', 'E'];
$match = ['A', 'C', 'C', 'D', 'E', 'F'];
echo checkArray($sample, $match) ? "true\n" : "false\n";//False

Это выведет:

true
false
false
true
true
true
true
false

Другие вопросы по теме