Arrays 算法问题-在列表中查找一组项目

Arrays 算法问题-在列表中查找一组项目,arrays,algorithm,loops,for-loop,while-loop,Arrays,Algorithm,Loops,For Loop,While Loop,以下是我想做的: 我有两张清单 清单1:00F0001,00F0002,00F0003,00F0004,00F0005,00F0006,00F0007,00F0008,00F0009,00F0010 列表2:00F0006,00F0007,00F0008(此列表由第一个项目($首秀)和最后一个项目($fin)生成) 我想做的是: 如果“列表2”在“列表1”中,则返回true,仅此而已 因此,我尝试使用2,但我被阻止:/ 我的代码: $id = substr($debut,0,4);

以下是我想做的:

我有两张清单

清单1:00F0001,00F0002,00F0003,00F0004,00F0005,00F0006,00F0007,00F0008,00F0009,00F0010

列表2:00F0006,00F0007,00F0008(此列表由第一个项目($首秀)和最后一个项目($fin)生成)

我想做的是:

如果“列表2”在“列表1”中,则返回true,仅此而已

因此,我尝试使用2,但我被阻止:/

我的代码:

    $id = substr($debut,0,4);
    echo '</br>id : '.$id; /* = 00F0*/

    $Start = substr($debut,4,25);
    $End = substr($fin,4,25);
    $range = $End - $Start +1;

    echo '</br>Range : '.$range; /* = 3 with the example I gave*/

    for ($i = 0;$i < $range;$i++){
        $indice2 = $Start + $i;
        $Num_Serie = str_pad($indice2, 4, '0', STR_PAD_LEFT);
        $Num_Serie_Final[$i] = $id.''.$Num_Serie;
    }
    $ArrayNS = $Num_Serie_Final;
$i_W = 0;
while(($produit = $reponse->fetch())AND($check3 == "false")){

    $ArrayProduit[$i_W] = $produit[1];
    $i_W++;
    }

for ($i2 = 0; $i2 < $i_W; $i2++){
    for ($i3 = 0; $i3 < $range; $i3++){
        if ($ArrayNS[$i2] == $ArrayProduit[$i3]){
          .... ???? .....
        }
    }
}
$id=substr($0,4);
回显“
id:”。$id;/*=00F0*/ $Start=substr($4,25); $End=substr($fin,4,25); $range=$End-$Start+1; 回声'
范围:'.$Range;/*=我举了一个例子*/ 对于($i=0;$i<$range;$i++){ $indicate2=$Start+$i; $Num_Serie=str_pad($indicate2,4,'0',str_pad_LEFT); $Num_Serie_决赛[$i]=$id.'.$Num_Serie; } $ArrayNS=$Num\u Serie\u Final; $i_W=0; 而($produit=$reponse->fetch())和($check3==“false”)){ $ArrayProduit[$i_W]=$produit[1]; $i_W++; } 对于($i2=0;$i2<$i_W;$i2++){ 对于($i3=0;$i3<$range;$i3++){ 如果($ArrayNS[$i2]==$ArrayProduit[$i3]){ .... ???? ..... } } }
第一个“for”是构建我的“List 2”。 “while”循环用于生成我的“列表1”

然后我做了一个双“for”循环,但我在这里锁定:/

编辑

我为感兴趣的人做了一些尝试:

    for ($i3 = 0; $i3 < $range; $i3++){
    for ($i2 = 0; $i2 < $i_W; $i2++){
        if ($ArrayNS[$i3] == $ArrayProduit[$i2]){
            for ($indice=0; $indice < $range; $indice++){
                if ($ArrayNS[$indice] == $ArrayProduit[$i2+$indice]){
                    $ok = true;
                    echo '$ArrayNS[$indice] : '.$ArrayNS[$indice].'   ==   $ArrayProduit[$i2+$indice] : '.$ArrayProduit[$i2+$indice].'</br>';
                }
                else {
                    $ok = false;
                    $id_erreur = $ArrayNS[$indice];
                    echo 'Fail with : '.$ArrayNS[$indice].'   !==   '.$ArrayProduit[$i2+$indice].'</br>';
                }
            }
            if ($ok) {
                echo 'Success !!!';
                return ($ok);
            }
            else {
                echo 'Fail !!!';
                return ($id_erreur);
            }
        }
    }
}
for($i3=0;$i3<$range;$i3++){
对于($i2=0;$i2<$i_W;$i2++){
如果($ArrayNS[$i3]==$ArrayProduit[$i2]){
对于($indice=0;$indice<$range;$indice++){
如果($ArrayNS[$indice]=$ArrayProduit[$i2+$indice]){
$ok=true;
回显“$ArrayNS[$indice]:”。$ArrayNS[$indice]。==$ArrayProduit[$i2+$indice]:”。$ArrayProduit[$i2+$indice]。
”; } 否则{ $ok=false; $id_erreur=$ArrayNS[$indice]; echo“失败,原因是:”.$ArrayNS[$indice]。!==”.$ArrayProduit[$i2+$indice]。
”; } } 如果($ok){ 呼应“成功!!!”; 返回($ok); } 否则{ 回音“失败!!!”; 回报($id_erreur); } } } }

可能不是最好的方法,但它很有效^ ^

我选择js作为控制台可测试性,但算法在php中是相同的

这个函数返回一个索引,但您只需检查您的索引是否与
-1
不同,就可以判断是否找到了它

我们的想法是循环遍历草堆的每个元素(
l1
),如果当前元素与针的第一个元素匹配(
l2
),那么我们开始从当前草堆索引(
i
)循环到针索引的末尾(
i+j
),但如果这些元素中的任何一个不匹配(在第一次出现时)我们跳到草堆的下一个值(
l1
)并重试。如果没有失败(
failedMatch
标志),则返回子序列的索引(
l2
l1
开始位置)

如果子序列没有出现在haystack中,我们按照约定返回
-1

这是一种从左到右的方法,因此它将只匹配子序列的第一次出现,如果它出现多次,您将无法知道

var l1 = [1,2,3,3,4,5,6],
    l2 = [3,4,5];

function subsequenceIndex(l1 /* haystack */, l2 /* needle */) {
    var startIndex = -1,
        failedMatch;

    for (var i = 0; i < l1.length; i++) {
        failedMatch = false;
        if (l1[i] === l2[0]) {

            for (var j = 1; j < l2.length; j++) {

                // check first that l1[i + j] is set
                if (l1[i + j] !== undefined && l2[j] !== l1[i + j]) {
                    failedMatch = true;
                    break;
                }
            }

            if (!failedMatch) {
                startIndex = i;
            }

        }
        if (startIndex !== -1) {
            return startIndex;
        }
     }

    return startIndex;
}
var l1=[1,2,3,3,4,5,6],
l2=[3,4,5];
函数子序列索引(l1/*草堆*/,l2/*针*/){
var startIndex=-1,
不匹配;
对于(变量i=0;i
与其检查是否相等,不如检查是否不相等,如果不匹配,则中断内部循环。使用标志来确定是否中断或完成内部循环。在外部循环中,在内部循环之后,检查标志是否成功。为了节省时间并发布解决方案,我尝试了其他方法,目前它正在工作很好,但如果以后不行,我会用你的算法;)