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

12
VHS
На сайте с 28.09.2007
Offline
142
VHS
#11

говнокод, но вроде работает

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

$m = array('a', 'b', 'f', 'r', 'v');
function check($array, $search, $count=0)
{
foreach ($array as $k=>$v)
{

$n = array_search($v, $search, true);


if ($n!==false)
{
unset($search[$n]);
} else {
print $count;
return;
}
}
$count++;
check($array, $search, $count);
}
check($m, $h);
G
На сайте с 24.10.2009
Offline
51
#12
VHS:
говнокод, но вроде работает

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

$m = array('a', 'b', 'f', 'r', 'v');
function check($array, $search, $count=0)
{
foreach ($array as $k=>$v)
{

$n = array_search($v, $search, true);


if ($n!==false)
{
unset($search[$n]);
} else {
print $count;
return;
}
}
$count++;
check($array, $search, $count);
}
check($m, $h);

Работает только при строгом порядке соответствия второго массива в первом. Если в первом или во втором массиве поменять местами какие нибудь элементы, код перестанет работать.

VHS
На сайте с 28.09.2007
Offline
142
VHS
#13

пример входных данных, когда не работает можно?

$h = array('a', 'b', 'f', 'r', 'b', 'v', 'r', 'b', 't', 'a');
$m = array('b', 'a');
shuffle($m);
shuffle($h);
function check($array, $search, $count=0)
{
foreach ($array as $k=>$v)
{

$n = array_search($v, $search, true);


if ($n!==false)
{
unset($search[$n]);
} else {
print $count;
return;
}
}
$count++;
check($array, $search, $count);
}
check($m, $h);

всегда выдает 2

---------- Добавлено 04.08.2014 в 18:35 ----------

$h = array('a', 'b', 'f', 'r', 'b', 'v', 'r', 'b', 't', 'a');
$m = array('a','b');
shuffle($m);
shuffle($h);
function check($array, &$search, $count=0)
{
$arr = array();
foreach ($array as $k=>$v)
{

$n = array_search($v, $search, true);


if ($n!==false && !in_array($n,$arr))
{
$arr[] = $n;
} else {
return $count;
}
}

foreach($arr as $k=>$v)
{
unset($search[$v]);
}

$count++;
$count = check($array, $search, $count);
return $count;
}
print 'Найдено и удалено из $h ' . check($m, $h) . ' массивов $m';

print_r($h);

с удалением найденных...

siv1987
На сайте с 02.04.2009
Offline
427
#14

навеяно кодом выше и примером с предыдущей странице


$h = array('a', 'b', 'b', 'b', 'b', 'b', 'c', 'a');
$m = array('a', 'b');
function check($m, &$h){
$v = array_count_values($h);
$r = array_intersect_key($v, array_fill_keys($m, 1));
$c = (! empty($r)) ? min($r) : 0;

if(! $c) return $c;

foreach($m as $k){
$i = 0;
foreach($h as $_k => $v){
if($v == $k){
$i++;
if($i > $c){
unset($h[$_k]);
}
}
}
}
return $c;
}
echo check($m, $h);
dkameleon
На сайте с 09.12.2005
Offline
386
#15

чем дальше - тем длинее код :)

Дизайн интерьера (http://balabukha.com/)
Mad_Man
На сайте с 10.11.2008
Offline
162
#16

Граждане, вы перегрелись.

Подсчёт делается элементарно

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

$count = array_count($n, $h);

function array_count($needle, $haystack)
{
$count = INF;
$array = array_count_values($haystack);

foreach ($needle as $item)
{
if (!isset($array[$item]))
{
return 0;
}

$count = min($count, $array[$item]);
}

return (int) $count;
}
VHS
На сайте с 28.09.2007
Offline
142
VHS
#17

Ну задача была еще и удалить из исходного массива массивы поиска. Поэтому мною и был предложен вариант с цикличным перебором массива. А дальше уже извращения с "красотой".

P.S. если есть еще примеры решения - давайте постить, интересно увидеть еще варианты

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

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

$result = array_erase($n, $h);


function array_erase($needle, $haystack, $count = null)
{
if ($count === null)
{
$count = array_count($needle, $haystack);
}

if (!$count)
{
return $haystack;
}


$result = $haystack;

foreach ($needle as $item)
{
$index = array_keys($result, $item);

for ($i = 0; $i < $count; $i++)
{
unset($result[$index[$i]]);
}
}

return $result;
}

function array_count($needle, $haystack)
{
$count = INF;
$array = array_count_values($haystack);

foreach ($needle as $item)
{
if (!isset($array[$item]))
{
return 0;
}

$count = min($count, $array[$item]);
}

return (int) $count;
}
G
На сайте с 24.10.2009
Offline
51
#19

Большое спасибо. Решения вполне подходят. Вы супер!

12

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