#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()
.
Важной частью является сравнение фрагмента массива, в котором вы выполняете поиск (здесь $in
), с массивом, который вы ищете (здесь $for
):
array_slice($in, $pos, $len) === $for
$pos
ранее был произведен поиск первого значения $for
, $len
is count($for)
.
Комментарии:
1. Пожалуйста, опубликуйте соответствующую часть вашего кода в вашем ответе (в дополнение к ссылке на демо).