Hola amigo Triby ... que pena no haber colocado el codigo..... no hay base de datos en el asunto... mira coloco algo de codigo ahora :)
A/no-A seria con / sin GAPs y ...
B/no-B seria con deep_search en TRUE/FALSE
Código PHP:
Ver originalpublic function findSubNoGaps(TagSequence $sub, $deep_search=null)
{
// obtener la primera ocurrencia con Find() y a partir de ahi recorrer CONTINUO $sub comparando uno contra uno cada tag, si falla..... chequear cuanto queda por recorrer de $this y si es > long($sub) entonces volver a buscar la primera ocurrencia con Find() y repetir el proceso
// rebobinar las secuencias aguja y pajar es responsabilidad del programador !!! no se hara aqui!
if ($this->length()==0 || $sub->length()==0)
Throw new \LengthException('Aguja o pajar no pueden estar vacios');
if ($this->length(true) < $sub->length(true))
Throw new \LengthException("Aguja no puede ser mayor que pajar");
$count = 0;
// while ext.
while ($this->valid() && $sub->valid() && ($this->length()- $this->key() >= $sub->length()) ) {
#echo "Entrando WHILE EXTERIOR<p/>";
$count = 0;
$found = ($this->find($tagSub)>=0);
if ($found){
$tag = $tagSub;
$count = 1;
}
{
#echo "Cursor de secuencia pajar fuera de rango sin coincidencias!";
return false;
}
#echo 'Sub buscado : '.$sub->key().' ] -- '; echo $sub->current()->getElementName(); echo '<p/> En Pajar: '.$this->key().' ] -- '; echo $tag->getElementName(); var_dump($found); echo '---------------<p/>';
// while int.
while ($found && $this->valid() && $sub->valid())
{
$found = ($tag->compareTo($tagSub)>=0);
if ($found)
$count++;
// solo para debug:
if ($this->valid() && $sub->valid())
{
#echo 'Sub buscado : '.$sub->key().' ] -- '; echo $tagSub->getElementName(); echo '<p/> En Pajar: '.$this->key().' ] -- '; echo $tag->getElementName(); var_dump($found); echo '---------------<p/>';
}
} // endWhile int.
} // endWhile ext.
#echo "<p/><i>Count = $count </i>";
return ($count == $sub->length());
}
Código PHP:
Ver originalpublic function findSubWithGaps(TagSequence $sub, $deep_search=null)
{
// Asumo puede haber "gaps"
// por eso busco con find() en vez de avanzar e ir comparando
// Deberia tener en cuenta que tags no-pueden aparecer en los Gaps, longitud minima y maxima permitida, etc.
if ($this->length()==0 || $sub->length()==0)
Throw new \LengthException('Aguja o pajar no pueden estar vacios');
if ($this->length(true) < $sub->length(true))
Throw new \LengthException("Aguja no puede ser mayor que pajar");
#echo "<h1>[ {$this->key()} ] $tag</h1><p/>";
#echo "<h1>[ {$sub->key()} ] $tagSub</h1><p/>";
$count = 0;
$found = ($this->find($tagSub)>=0);
if ($found)
$tag = $tagSub;
echo 'Sub buscado : '.$sub->key().' ] -- '; echo $sub->current()->getElementName(); echo '<p/> En Pajar: '.$this->key().' ] -- '; echo $tag->getElementName(); var_dump($found); echo '---------------<p/>';
while ($found && $this->valid() && $sub->valid())
{
$count++;
$found = ($this->find($tagSub)>=0);
if ($found)
$tag = $tagSub;
// solo para debug:
if ($this->valid() && $sub->valid())
{
echo 'Sub buscado : '.$sub->key().' ] -- '; echo $tagSub->getElementName(); echo '<p/> En Pajar: '.$this->key().' ] -- '; echo $tag->getElementName(); var_dump($found); echo '---------------<p/>'; }
} // endWhile
echo "<p/><i>Count = $count </i>";
return ($count == $sub->length());
}
Como veras..... esas dos funciones son bastante diferentes excepto por algunos chequeos de tipo Runtime ... pero en ambas debo ahora agregar la parte de DEEP_SEARCH que seria si quiero que las busquedas se hagan lineales o como un DomNodeList donde hay una "profundidad" involucrada y... eso se podria hacer metiendo algunos IF aqui y alla en ambas dos funciones......
Entonces.... hago de las dos funciones solo una ? hago de esas dos, cuatro ? las coloco como clase aparte especializada en busquedas ? etc ... :P
Mil gracias!