Найти массив в массиве.

12
G
На сайте с 24.10.2009
Offline
51
1681

Помогите пожалуйста. Уже 2 суток не могу придумать рациональный вариант. В голове только говнокод. :(

Есть массив $h и массив $m. Необходимо найти сколько массивов $m содержится в массиве $h.

Пример:


$h = array('a', 'b', 'f', 'r', 'b', 'v', 'r', 'b', 't', 'a');
$m = array('a', 'b');

$result = check($m, $h);

//Ищем пары 'a', 'b' расположенные в любом порядке в массиве $h.
//$result должен быть: 2
//Потому что пара a, b встречается 2 раза. А непарная оставшаяся b - не подходит.

Проблема в том, что код должен работать для любого набора $m. Элементы в массиве $m не будут повторяться.

При этом было бы неплохо еще и удалить найденные пары из массива. Только я это даже не знаю, как придумать.

Спасибо большое заранее.

I
На сайте с 10.06.2014
Offline
1
#1

На php не знаю как написать код, поэтому напишу вариант на ruby, из названия методов смысл думаю понятен


a = ['a', 'b', 'f', 'r', 'b', 'v', 'r', 'b', 't', 'a', 'a', 'b']
b = ['a', 'b']

def check(a = [], b = [])
intersections = a.each_slice(b.size).to_a.select { |arr| arr == b }
intersections.size
end

puts check(a, b) # => 2
G
На сайте с 24.10.2009
Offline
51
#2

C руби я к сожалению совершенно не знаком. По-этому не понял вот эту строчку совсем:

intersections = a.each_slice(b.size).to_a.select { |arr| arr == b }
dkameleon
На сайте с 09.12.2005
Offline
386
#3

function check($m, $h) {
$counts = array();
foreach($h as $v) {
if (in_array($v, $m)) {
if (!isset($counts[$v])) { $counts[$v] = 0; }
$counts[$v]++;
}
}
return count($counts) == count($m) ? min($counts) : 0;
}

вот так должно работать.

Дизайн интерьера (http://balabukha.com/)
siv1987
На сайте с 02.04.2009
Offline
427
#4


function check($m, $h) {
$intersections = array_unique(array_intersect($h, $m));
return count($intersections);
}
G
На сайте с 24.10.2009
Offline
51
#5
siv1987:

function check($m, $h) {
$intersections = array_unique(array_intersect($h, $m));
return count($intersections);
}

Этот код будет всегда возвращать количество элементов в массиве $m.

siv1987
На сайте с 02.04.2009
Offline
427
#6
Gaaarfild:
Этот код будет всегда возвращать количество элементов в массиве $m.

Этот код будет всегда возвращать количество элементов которые пересекаются в обоих массивов. А исходя из того, что элементы в массиве $m не будут повторятся, array_unique уникализирует получившийся массив, получая таким образом требуемый результат - количество пар в массивах которые есть и в первом и во втором массиве.

dkameleon
На сайте с 09.12.2005
Offline
386
#7
siv1987:
Этот код будет всегда возвращать количество элементов которые пересекаются в обоих массивов. А исходя из того, что элементы в массиве $m не будут повторятся, array_unique уникализирует получившийся массив, получая таким образом требуемый результат - количество пар в массивах которые есть и в первом и во втором массиве.

я аж полез было проверять документацию :)

$h = array('a', 'b', 'f', 'r', 'b', 'v', 'r', 'b', 't', 'a');
$m = array('a', 'b', 'f', 'r', 'v');

$result = check($m, $h);

должно быть 1, а ваш код дает 5.

вот интереснее вариант:

function check($m, $h) {
$hh = array_count_values($h);
$mm = array_combine($m, $m);
$nn = array_intersect_key($hh, $mm);
return count($nn) == count($m) ? min($nn) : 0;
}
siv1987
На сайте с 02.04.2009
Offline
427
#8
dkameleon:
должно быть 1, а ваш код дает 5.

Почему 1? Там пять элементов встречаются. Или я не понял суть задачи.

Тогда не понимаю почему у ТСа


//Ищем пары 'a', 'b' расположенные в любом порядке в массиве $h.
//$result должен быть: 2
//Потому что пара a, b встречается 2 раза. А непарная оставшаяся b - не подходит.
dkameleon
На сайте с 09.12.2005
Offline
386
#9
siv1987:
Тогда не понимаю почему у ТСа

всё правильно у него с условием :)

"Необходимо найти сколько массивов $m содержится в массиве $h".

берете и поштучно вычеркиваете массивы $m, а не элементы массива $m

Mad_Man
На сайте с 10.11.2008
Offline
162
#10

Самый простой вариант в случае строгого порядка следования элементов и перегретой на жаре головы - это собрать массив в строку (CSV или схожее если размер элементов динамический), после чего рассматривать полученное как строку, производя поиск и замену строковыми функциями.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий