У меня возникла проблема в моем проекте. Вот случай
Допустим, у меня есть два массива, 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
Но это не возвращает того, что я хочу делать. заранее спасибо
@RameshS Я не думаю, что уникальный массив может удовлетворить мою потребность
Вам нужны уникальные значения из обоих массивов? Что ты хочешь?
Должны ли массивы быть одинаковой длины или их можно сравнивать с фрагментом массива при одинаковом порядке?
Сначала используйте array_intersect на array_1, а затем используйте это решение stackoverflow.com/questions/17353683/…
Нет, мне не нужна уникальная ценность. Я хочу либо true / false, если в первом массиве есть элемент второго массива один после пыльника
@Joseph_J Нет, два массива не имеют одинаковой длины
@HabibHassan Вы можете создать свой собственный алгоритм для этого, используя базовые foreach и if else
@HabibHassan проверь это 3v4l.org/0EgPq
@HabibHassan должен ['B', 'D', 'E'] возвращать истину или ложь?
@Nick ['B', 'D', 'E'] должен возвращать false






Изменить 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
Лучше с добавлением клея. По-прежнему могут возникать проблемы, если в значениях есть связующий символ или если значения в $array_2 являются подстроками значений в $array_1, например. если $array_1 = ['A', 'BB', 'C', 'D', 'E', 'F']; вернет истину.
Новая версия не будет работать, если например $array_1 = ['A', 'C', 'C', 'D', 'E', 'F']; и $array_2 = ['C', 'D', 'E']; :-(
О Конечно. Эх я иду спать. Классная проблема, я уверен, что есть действительно хорошее решение, которое нам не хватает. Но не сегодня вечером. Не отставать, потому что я думаю, что мое оригинальное решение действительно хорошо, если вы знаете, что строки будут иметь длину всего 1 символ.
Я считаю, что опубликованное мной решение (с использованием json_encode) решает эту проблему надежности, сохраняя при этом простоту, но я думаю, что OP в этом не нуждается :)
Вот функция, которая надежно проверяет, что значения в $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
Если я что-то не пропустил, вы можете просто сделать это:
$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
Использовать уникальный массив